{
 "cells": [
  {
   "metadata": {},
   "cell_type": "code",
   "outputs": [],
   "execution_count": null,
   "source": [
    "%env LLM_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1\n",
    "%env LLM_API_KEY=sk-替换为自己的Key"
   ],
   "id": "6a0b83e57bd75a2b"
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "b728e7a8-dee3-486f-a193-ec7f519ecfce",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-07T08:57:57.037634Z",
     "iopub.status.busy": "2025-03-07T08:57:57.037482Z",
     "iopub.status.idle": "2025-03-07T08:57:57.043826Z",
     "shell.execute_reply": "2025-03-07T08:57:57.043445Z",
     "shell.execute_reply.started": "2025-03-07T08:57:57.037621Z"
    }
   },
   "outputs": [],
   "source": [
    "%%capture --no-stderr\n",
    "!pip install langchain langchain-community langchain-ollama langchain-openai langchain_chroma pypdf sentence_transformers shutil openpyxl FlagEmbedding"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "aa25b4ef-1e75-49ab-847b-d1525e403913",
   "metadata": {},
   "source": [
    "LangGraph可视化依赖"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b024725e-211d-4512-aafa-888fb85c88fd",
   "metadata": {},
   "outputs": [],
   "source": [
    "!sudo apt install -y graphviz libgraphviz-dev\n",
    "!pip install pygraphviz"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "27ff306d-e226-48fe-be27-9802436c2258",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-07T08:57:57.050408Z",
     "iopub.status.busy": "2025-03-07T08:57:57.050290Z",
     "iopub.status.idle": "2025-03-07T08:57:57.262820Z",
     "shell.execute_reply": "2025-03-07T08:57:57.262398Z",
     "shell.execute_reply.started": "2025-03-07T08:57:57.050396Z"
    }
   },
   "outputs": [],
   "source": [
    "import os\n",
    "import pandas as pd\n",
    "\n",
    "expr_version = 'new_arch_v3_r1_reasoning_rag'\n",
    "\n",
    "preprocess_output_dir = os.path.join(os.path.pardir, 'outputs', 'v1_20240713')\n",
    "expr_dir = os.path.join(os.path.pardir, 'experiments', expr_version)\n",
    "\n",
    "os.makedirs(expr_dir, exist_ok=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1bb5a96c-726c-44e9-a125-abb9e5124ae6",
   "metadata": {},
   "source": [
    "# 加载文档"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "9d0220e8-fdcd-4890-acab-45678d4b844f",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-07T08:57:57.263659Z",
     "iopub.status.busy": "2025-03-07T08:57:57.263321Z",
     "iopub.status.idle": "2025-03-07T08:57:58.975775Z",
     "shell.execute_reply": "2025-03-07T08:57:58.975296Z",
     "shell.execute_reply.started": "2025-03-07T08:57:57.263646Z"
    }
   },
   "outputs": [],
   "source": [
    "from langchain_community.document_loaders import PyPDFLoader\n",
    "\n",
    "loader = PyPDFLoader(os.path.join(os.path.pardir, 'data', '2024全球经济金融展望报告.pdf'))\n",
    "documents = loader.load()\n",
    "\n",
    "qa_df = pd.read_excel(os.path.join(preprocess_output_dir, 'question_answer.xlsx'))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1831ff80-83e6-4b61-8085-5e26b8957af8",
   "metadata": {},
   "source": [
    "# 切分"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "85670f78-ec51-4500-98b1-03ab1c3413e3",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-07T08:57:58.976500Z",
     "iopub.status.busy": "2025-03-07T08:57:58.976324Z",
     "iopub.status.idle": "2025-03-07T08:57:59.028071Z",
     "shell.execute_reply": "2025-03-07T08:57:59.027584Z",
     "shell.execute_reply.started": "2025-03-07T08:57:58.976487Z"
    }
   },
   "outputs": [],
   "source": [
    "from uuid import uuid4\n",
    "import os\n",
    "import pickle\n",
    "\n",
    "from langchain.text_splitter import RecursiveCharacterTextSplitter\n",
    "\n",
    "def split_docs(documents, filepath, chunk_size=400, chunk_overlap=40, seperators=['\\n\\n\\n', '\\n\\n'], force_split=False):\n",
    "    if os.path.exists(filepath) and not force_split:\n",
    "        print('found cache, restoring...')\n",
    "        return pickle.load(open(filepath, 'rb'))\n",
    "\n",
    "    splitter = RecursiveCharacterTextSplitter(\n",
    "        chunk_size=chunk_size,\n",
    "        chunk_overlap=chunk_overlap,\n",
    "        separators=seperators\n",
    "    )\n",
    "    split_docs = splitter.split_documents(documents)\n",
    "    for chunk in split_docs:\n",
    "        chunk.metadata['uuid'] = str(uuid4())\n",
    "\n",
    "    pickle.dump(split_docs, open(filepath, 'wb'))\n",
    "\n",
    "    return split_docs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "edb6468a-6917-4314-bdf1-97ae0a0ebeb2",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-07T08:57:59.029664Z",
     "iopub.status.busy": "2025-03-07T08:57:59.029540Z",
     "iopub.status.idle": "2025-03-07T08:57:59.032738Z",
     "shell.execute_reply": "2025-03-07T08:57:59.032365Z",
     "shell.execute_reply.started": "2025-03-07T08:57:59.029651Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "found cache, restoring...\n"
     ]
    }
   ],
   "source": [
    "splitted_docs = split_docs(documents, os.path.join(preprocess_output_dir, 'split_docs.pkl'), chunk_size=500, chunk_overlap=50)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7e3e66f9-600f-4117-9d09-59c99f96727e",
   "metadata": {},
   "source": [
    "# 检索"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "b1114ffe-e885-4a07-8b91-fd4b7173a2e1",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-07T08:57:59.033318Z",
     "iopub.status.busy": "2025-03-07T08:57:59.033166Z",
     "iopub.status.idle": "2025-03-07T08:58:20.151664Z",
     "shell.execute_reply": "2025-03-07T08:58:20.149112Z",
     "shell.execute_reply.started": "2025-03-07T08:57:59.033306Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "device: cuda\n"
     ]
    }
   ],
   "source": [
    "from langchain.embeddings import HuggingFaceBgeEmbeddings\n",
    "from langchain_community.vectorstores import Chroma\n",
    "import torch\n",
    "import shutil\n",
    "\n",
    "from tqdm.auto import tqdm\n",
    "from langchain_community.vectorstores import Chroma\n",
    "\n",
    "\n",
    "device = 'cuda' if torch.cuda.is_available() else 'cpu'\n",
    "print(f'device: {device}')\n",
    "\n",
    "def get_embeddings(model_path):\n",
    "    embeddings = HuggingFaceBgeEmbeddings(\n",
    "        model_name=model_path,\n",
    "        model_kwargs={'device': device},\n",
    "        encode_kwargs={'normalize_embeddings': True},\n",
    "        # show_progress=True\n",
    "        query_instruction='为这个句子生成表示以用于检索相关文章：'\n",
    "    )\n",
    "    return embeddings\n",
    "\n",
    "\n",
    "model_path = '/DataScience/HuggingFace/Models/BAAI/bge-large-zh-v1.5'\n",
    "embeddings = get_embeddings(model_path)\n",
    "\n",
    "persist_directory = os.path.join(expr_dir, 'chroma', 'bge')\n",
    "shutil.rmtree(persist_directory, ignore_errors=True)\n",
    "vector_db = Chroma.from_documents(\n",
    "    splitted_docs,\n",
    "    embedding=embeddings,\n",
    "    persist_directory=persist_directory\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "265b201b-f1cb-4874-8d2d-0f30a07fa6c5",
   "metadata": {},
   "source": [
    "# 构建流程"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "13b76ab4-41c4-44e0-9b59-9e3f5effa50e",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-07T08:58:20.155386Z",
     "iopub.status.busy": "2025-03-07T08:58:20.154641Z",
     "iopub.status.idle": "2025-03-07T08:58:20.384811Z",
     "shell.execute_reply": "2025-03-07T08:58:20.384334Z",
     "shell.execute_reply.started": "2025-03-07T08:58:20.155316Z"
    }
   },
   "outputs": [],
   "source": [
    "# from langchain_deepseek import ChatDeepSeek\n",
    "from langchain_ollama import ChatOllama\n",
    "\n",
    "r1 = ChatOllama(model='deepseek-r1:latest', temperature=0.01)\n",
    "llm = ChatOllama(model='qwen2:7b-instruct')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "0768cfb5-300f-4537-a013-b01d8c282099",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-07T08:58:20.385468Z",
     "iopub.status.busy": "2025-03-07T08:58:20.385320Z",
     "iopub.status.idle": "2025-03-07T08:58:20.387993Z",
     "shell.execute_reply": "2025-03-07T08:58:20.387662Z",
     "shell.execute_reply.started": "2025-03-07T08:58:20.385456Z"
    }
   },
   "outputs": [],
   "source": [
    "# resp = r1.invoke('为什么天空是蓝色的')\n",
    "# resp.content结构为：\n",
    "# <think>...</think>..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "13f207e5-a95b-4f06-a8b7-8e64e901f208",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-07T08:58:20.388665Z",
     "iopub.status.busy": "2025-03-07T08:58:20.388527Z",
     "iopub.status.idle": "2025-03-07T08:58:20.417740Z",
     "shell.execute_reply": "2025-03-07T08:58:20.417327Z",
     "shell.execute_reply.started": "2025-03-07T08:58:20.388652Z"
    }
   },
   "outputs": [],
   "source": [
    "from langgraph.graph import END, StateGraph\n",
    "from typing_extensions import TypedDict"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "05b43de9-e79d-43e0-b1fa-3d31f4eeadc1",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-07T08:58:20.418506Z",
     "iopub.status.busy": "2025-03-07T08:58:20.418347Z",
     "iopub.status.idle": "2025-03-07T08:58:20.421112Z",
     "shell.execute_reply": "2025-03-07T08:58:20.420792Z",
     "shell.execute_reply.started": "2025-03-07T08:58:20.418493Z"
    }
   },
   "outputs": [],
   "source": [
    "class RAGState(TypedDict):\n",
    "    question: str\n",
    "    retrieved_context: str\n",
    "    router_decision: str\n",
    "    answer_to_question: str\n",
    "    missing_information: str\n",
    "    useful_information: str\n",
    "    reasoning: str\n",
    "    n_round: int"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "722bf7de-bf4e-43d8-85a4-73f683750ffa",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-07T08:58:20.421747Z",
     "iopub.status.busy": "2025-03-07T08:58:20.421627Z",
     "iopub.status.idle": "2025-03-07T08:58:20.428298Z",
     "shell.execute_reply": "2025-03-07T08:58:20.427785Z",
     "shell.execute_reply.started": "2025-03-07T08:58:20.421735Z"
    }
   },
   "outputs": [],
   "source": [
    "from langchain_core.prompts import PromptTemplate\n",
    "\n",
    "VALIDATE_PROMPT = PromptTemplate(\n",
    "    input_variables=[\"retrieved_context\", \"question\"],\n",
    "    template=\"\"\"\n",
    "# 任务描述\n",
    "\n",
    "您是一名检索验证员。\n",
    "系统会向您提供一个问题和一些背景信息，这些背景信息可能包含问题的答案，也可能不包含。\n",
    "您的任务是仔细查看这些文本块，并提供包含三个字段的 JSON 响应：\n",
    "\n",
    "1. status：检索到的背景信息是否包含问题的答案。\n",
    "- 如果检索到的背景信息包含问题答案，则为 \"COMPLETE\"，否则为 \"INCOMPLETE\"。只有这两个取值，其他取值都是非法的。\n",
    "\n",
    "2. useful_information：从检索到的背景信息中获取的有用信息。要简洁明了。\n",
    "- 大部分情况下，这部分信息不能为空，如果确实没有有用信息，则将其设置为空字符串。\n",
    "- 如果status是COMPLETE，则这部分一定要有。\n",
    "\n",
    "3. missing_information：如果要完整回答这个问题，还需要的信息，这个信息将用来使用向量模型进一步检索知识库，以便补充信息。\n",
    "- 如果status是INCOMPLETE，则这部分信息一定要有。\n",
    "\n",
    "# 背景信息\n",
    "\n",
    "---\n",
    "{retrieved_context}\n",
    "---\n",
    "\n",
    "# 返回值要求\n",
    "    \n",
    "    请按以下格式以字典形式提供您的答复。请严格按照此格式返回结果，不要包含描述性内容和任何其他无关内容。\n",
    "\n",
    "```json\n",
    "{{\"status\": \"<status>\",\n",
    "\"useful_information\": \"<useful_information>\",\n",
    "\"missing_information\": \"<missing_information>\"}}\n",
    "```\n",
    "    \n",
    "这里是响应的样例：\n",
    "\n",
    "```json\n",
    "{{\"status\": \"COMPLETE\",\n",
    "\"useful_information\": \"The capital city of Canada is Ottawa.\",\n",
    "\"missing_information\": \"The capital city of Mexico\"}}\n",
    "```\n",
    "\n",
    "\n",
    "# 问题\n",
    "\n",
    "{question}\n",
    "    \"\"\"\n",
    ")\n",
    "\n",
    "ANSWER_QUESTION = PromptTemplate(\n",
    "    input_variables=[\"retrieved_context\", \"question\"],\n",
    "    template=\"\"\"\n",
    "你是一个金融分析师，擅长根据所获取的信息片段，对问题进行分析和推理。\n",
    "你的任务是根据所获取的信息片段（<<<<context>>><<<</context>>>之间的内容）回答问题。\n",
    "回答保持简洁，不必重复问题，不要添加描述性解释和与答案无关的任何内容。\n",
    "已知信息：\n",
    "<<<<context>>>\n",
    "{retrieved_context}\n",
    "<<<</context>>>\n",
    "\n",
    "问题：{question}\n",
    "请回答：\n",
    "    \"\"\"\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7cf22adc-7371-447e-a73c-450887cf5563",
   "metadata": {},
   "source": [
    "## 构建Workflow"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "1382b3a7-0ad3-4743-a230-8dbaa6e43016",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-07T08:58:20.428941Z",
     "iopub.status.busy": "2025-03-07T08:58:20.428786Z",
     "iopub.status.idle": "2025-03-07T08:58:20.433651Z",
     "shell.execute_reply": "2025-03-07T08:58:20.433228Z",
     "shell.execute_reply.started": "2025-03-07T08:58:20.428929Z"
    }
   },
   "outputs": [],
   "source": [
    "import json"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "093ce9eb-b7d6-44fe-86c0-65b09a6f37ca",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-07T08:58:20.434193Z",
     "iopub.status.busy": "2025-03-07T08:58:20.434070Z",
     "iopub.status.idle": "2025-03-07T08:58:20.439305Z",
     "shell.execute_reply": "2025-03-07T08:58:20.438876Z",
     "shell.execute_reply.started": "2025-03-07T08:58:20.434180Z"
    }
   },
   "outputs": [],
   "source": [
    "n_chunks = 3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "22491450-92c7-43cf-bc6a-d962219593ef",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-07T08:58:20.439886Z",
     "iopub.status.busy": "2025-03-07T08:58:20.439761Z",
     "iopub.status.idle": "2025-03-07T08:58:20.445527Z",
     "shell.execute_reply": "2025-03-07T08:58:20.445114Z",
     "shell.execute_reply.started": "2025-03-07T08:58:20.439874Z"
    }
   },
   "outputs": [],
   "source": [
    "import re\n",
    "\n",
    "def extract_json(text):\n",
    "    match = re.search(r'\\{.*\\}', text, re.DOTALL)\n",
    "    if match:\n",
    "        try:\n",
    "            return json.loads(match.group())\n",
    "        except json.JSONDecodeError:\n",
    "            print(\"提取的内容不是有效的JSON\")\n",
    "    return None"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "a410f929-118b-4adb-9b7d-fc29e80ae2e8",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-07T08:58:20.446071Z",
     "iopub.status.busy": "2025-03-07T08:58:20.445938Z",
     "iopub.status.idle": "2025-03-07T08:58:20.451943Z",
     "shell.execute_reply": "2025-03-07T08:58:20.451512Z",
     "shell.execute_reply.started": "2025-03-07T08:58:20.446059Z"
    }
   },
   "outputs": [],
   "source": [
    "def retrieve(state: RAGState):\n",
    "    print(f\"\\n=== STEP 1: RETRIEVAL (round: {state.get('n_round', 0)})===\")\n",
    "    \n",
    "    question = state['question']\n",
    "    print(\"Searching for:\", question)\n",
    "    \n",
    "    chunks = vector_db.similarity_search(question, k=n_chunks)\n",
    "    return {'retrieved_context': '\\n\\n'.join([doc.page_content for doc in chunks]), 'n_round': state.get('n_round', 0) + 1}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "457686ad-cb62-4cf4-8f99-ba7516947259",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-07T08:58:20.452519Z",
     "iopub.status.busy": "2025-03-07T08:58:20.452393Z",
     "iopub.status.idle": "2025-03-07T08:58:20.457948Z",
     "shell.execute_reply": "2025-03-07T08:58:20.457569Z",
     "shell.execute_reply.started": "2025-03-07T08:58:20.452507Z"
    }
   },
   "outputs": [],
   "source": [
    "def validate_retrieval(state: RAGState):\n",
    "    print(f\"\\n=== STEP 2: VALIDATION (round: {state.get('n_round', 0)})===\")\n",
    "    question = state['question']\n",
    "    retrieved_context = state['retrieved_context']\n",
    "    # print(\"Retrieved Context:\\n\", retrieved_context)\n",
    "    \n",
    "    validation_chain = VALIDATE_PROMPT | r1\n",
    "    retry_count = 5\n",
    "\n",
    "    # 兜底\n",
    "    router_decision = 'INCOMPLETE'\n",
    "    missing_information = question\n",
    "    useful_information = ''\n",
    "    reasoning = ''\n",
    "    \n",
    "    while retry_count >= 0:\n",
    "        try:\n",
    "            llm_output = validation_chain.invoke({'retrieved_context': retrieved_context, 'question': question}).content\n",
    "            # print('llm_output:', llm_output)\n",
    "            \n",
    "            reasoning = llm_output.split('<think>')[1].split('</think>')[0].strip()\n",
    "            response = llm_output.split('</think>')[1].strip()\n",
    "            structured_response = extract_json(response)\n",
    "        \n",
    "            router_decision = structured_response['status'].strip().upper()\n",
    "            missing_information = structured_response['missing_information']\n",
    "            useful_information = structured_response['useful_information']\n",
    "            \n",
    "            print('structured response:', structured_response)\n",
    "            # print('reasoning:', reasoning)\n",
    "            print(\"router decision:\", router_decision)\n",
    "            # print(\"missing information:\", missing_information)\n",
    "            # print('useful information:', useful_information)\n",
    "            \n",
    "            break\n",
    "        except Exception as e:\n",
    "            retry_count -= 1\n",
    "            print(f\"error, e: {e}, llm_output: {llm_output}, {retry_count} retries left\")\n",
    "\n",
    "    return {\n",
    "        'router_decision': router_decision,\n",
    "        'missing_information': missing_information,\n",
    "        'useful_information': useful_information,\n",
    "        'reasoning': reasoning\n",
    "    }"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "a7d440d6-953b-4655-88ac-f87177539c3a",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-07T08:58:20.458515Z",
     "iopub.status.busy": "2025-03-07T08:58:20.458389Z",
     "iopub.status.idle": "2025-03-07T08:58:20.464003Z",
     "shell.execute_reply": "2025-03-07T08:58:20.463561Z",
     "shell.execute_reply.started": "2025-03-07T08:58:20.458502Z"
    }
   },
   "outputs": [],
   "source": [
    "def answer(state: RAGState):\n",
    "    print(f\"\\n=== STEP 3: ANSWERING (round: {state.get('n_round', 0)})===\")\n",
    "\n",
    "    question = state['question']\n",
    "    context = state['retrieved_context']\n",
    "\n",
    "    answer_chain = ANSWER_QUESTION | llm\n",
    "    llm_output = answer_chain.invoke({\n",
    "        'retrieved_context': context,\n",
    "        'question': question\n",
    "    }).content\n",
    "    # answer = llm_output.split('</think>')[1].strip()\n",
    "    answer = llm_output.strip()\n",
    "    print('answer:', answer)\n",
    "    \n",
    "    return {'answer_to_question': answer}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "115102df-dcf4-472c-a0da-84c399f3e0a7",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-07T08:58:20.464544Z",
     "iopub.status.busy": "2025-03-07T08:58:20.464420Z",
     "iopub.status.idle": "2025-03-07T08:58:20.470022Z",
     "shell.execute_reply": "2025-03-07T08:58:20.469639Z",
     "shell.execute_reply.started": "2025-03-07T08:58:20.464531Z"
    }
   },
   "outputs": [],
   "source": [
    "def find_missing_information(state: RAGState):\n",
    "    print(f\"\\n=== STEP 2b: FINDING MISSING INFORMATION (round: {state.get('n_round', 0)})===\")\n",
    "    question = state[\"missing_information\"]\n",
    "\n",
    "    print(\"Searching for:\", question)\n",
    "    \n",
    "    chunks = vector_db.similarity_search(question, k=n_chunks)\n",
    "    newly_retrieved_context = '\\n\\n'.join([doc.page_content for doc in chunks])\n",
    "    previously_retrieved_useful_information = state[\"useful_information\"]\n",
    "    \n",
    "    combined_context = f\"{previously_retrieved_useful_information}\\n{newly_retrieved_context}\"\n",
    "    # print(\"newly retrieved context:\", newly_retrieved_context)\n",
    "    \n",
    "    return {\"retrieved_context\": combined_context, 'n_round': state.get('n_round', 0) + 1}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "5660fcfd-ab9b-401a-9d25-4199b7c880d4",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-07T08:58:20.470566Z",
     "iopub.status.busy": "2025-03-07T08:58:20.470443Z",
     "iopub.status.idle": "2025-03-07T08:58:20.475505Z",
     "shell.execute_reply": "2025-03-07T08:58:20.475047Z",
     "shell.execute_reply.started": "2025-03-07T08:58:20.470554Z"
    }
   },
   "outputs": [],
   "source": [
    "def decide_route(state: RAGState):\n",
    "    return state[\"router_decision\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "ba298d6c-8511-46ff-9fa3-5da0c69cf3d5",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-07T08:58:20.478159Z",
     "iopub.status.busy": "2025-03-07T08:58:20.478023Z",
     "iopub.status.idle": "2025-03-07T08:58:20.485285Z",
     "shell.execute_reply": "2025-03-07T08:58:20.484967Z",
     "shell.execute_reply.started": "2025-03-07T08:58:20.478146Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<langgraph.graph.state.StateGraph at 0x7fd62076b190>"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "workflow = StateGraph(RAGState)\n",
    "\n",
    "workflow.add_node('retrieve context', retrieve)\n",
    "workflow.add_node('is retrieved context complete?', validate_retrieval)\n",
    "workflow.add_node('answer', answer)\n",
    "workflow.add_node('find missing information', find_missing_information)\n",
    "\n",
    "workflow.set_entry_point('retrieve context')\n",
    "workflow.add_edge('retrieve context', 'is retrieved context complete?')\n",
    "workflow.add_conditional_edges(\n",
    "    'is retrieved context complete?',\n",
    "    decide_route,\n",
    "    {\n",
    "        'COMPLETE': 'answer',\n",
    "        'INCOMPLETE': 'find missing information'\n",
    "    }\n",
    ")\n",
    "workflow.add_edge('find missing information', 'is retrieved context complete?')\n",
    "workflow.add_edge('answer', END)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "20ad849c-8d30-4e75-936b-cecdcddb1415",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-07T08:58:20.485869Z",
     "iopub.status.busy": "2025-03-07T08:58:20.485708Z",
     "iopub.status.idle": "2025-03-07T08:58:20.491887Z",
     "shell.execute_reply": "2025-03-07T08:58:20.491444Z",
     "shell.execute_reply.started": "2025-03-07T08:58:20.485856Z"
    }
   },
   "outputs": [],
   "source": [
    "compiled_graph = workflow.compile()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "id": "4ae384fb-d3e4-46c4-8931-b84daa79c385",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-08T15:38:34.644981Z",
     "iopub.status.busy": "2025-03-08T15:38:34.644810Z",
     "iopub.status.idle": "2025-03-08T15:38:34.716506Z",
     "shell.execute_reply": "2025-03-08T15:38:34.716051Z",
     "shell.execute_reply.started": "2025-03-08T15:38:34.644967Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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32gMmj7dPW2ab+JEZGcjPFzsEmkANTaiuBh79qCwUF5YKG9s9KhUigkTxk2bNnvq1Klz5sxJSEgQu0aiC4yxN/yZTKYvvvhi27at//3vR5WVtaGhigkTZLm5ntxczJqF1FSx66NBo7YWe/eioAD5+eo9ezxOpy89PXnevEXz5s1bsGBBOP8momGBsTc8+Xy+7du3f/TRR1u3/qe4+KBCIZs6VTl/vmv+fEyZcoYLt4lO096O7duxbRu2blWVlLiVSsW0aZPmz//h1VdfnZOTI3Z1ROePsTeseL3er7/+esOGDe+9t76+vjkrS71ggWvePFx2GbRasYujIauhAZ99hq1bZVu3qmpqXBkZxsWLl15//fUTJkwQuzSic8bYGyZ27NixZs2aTZvebWxsyc5WL17sWrwYo0eLXRYNL34/du3Chg3YsEFVVeUeMSJ58eKlt95666hRo8Qujai/GHtDW3t7+9q1a9944+V9+0rHj1ddf7178WJkZopd1vm68068/TYAlJdj5Eixq6Gz8/uxZw82bMA776iqqjw/+MHse+65/6qrrlJyBzoNenzw0FBVWVm5atWqxMS4++//WXb2d7t2oajI/cgjQzjzaAiRyTB5Mp5/HkePurds8QcFfb148Y/T05OfffbZlpYWsasj6pWfhhqTybRq1aqgIFVqqur559HUBL9/UA833wwAmzf33dLrhdsNt1v8mgfhwhkM3fYyHD2Khx6CwaDS67W/+93vOjo6xP5FITozbu0NJR0dHatXrx45MnXt2ldffNFdVub+1a8QFSV2Wb1qaMC77/a3sVwOpVJCJ5qe08IRvdvepadj9WocO+ZeudL6xBO/zspKW7t2rc93hqcvEYlM7Nyl/iopKbnkkqzQUMX/+39oaxvojZLFiwFArYbdjiVLoNXiD38QfmQyYdUqjBgBtRp6Pa64AoWFwo9mzz79+xbY/jhbb3fcITQrL+/66F76nzVLaF9R0dXe4RAes5eR0XcPZxva2vDooxg1CkFB0Okwfz4+//yUBk4nXnwRkyZBo0FQEEaMwMqVOH78DEvM78dbb2HUKKjVSE/H66/3sXB6L7gzz376067P+tWvhImvv95btwM2NDbi/vvlSqV87txZx48fF/tXh+gUjL2h4W9/+5tarZw7V1ldPdCrsMCwYoWwDv31r4WRp5+G34+mJowYIazf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E86fPy8Sido6B4Q6DcZeJ1EqlS+++OKaNWvsq+aysjKLxdLySrCkpAQAvL29776LyWRKpVLrBFbJycmLFy9OT0+PiYkBgJ9//jk5ObmFmZeVlX3++efXrl17//33W/MSbt68OX78+EYjT506ZX26jn54yzZs2PD2229XVlbSaLSWpyQI4rPPPhs+fPj8+fNjY2Mb3oVLpE0Pb4TD4ezZsycuLm7WrFl79uy554JAiCwYe51Bp9ONHz8+Ly9PrVbbRzKZTAAwm80tPNA6jaWZs8PNZjNB1O+m7tOnz5AhQ3bs2BETE3P79u2zZ8/u2LEjLS2t4UMuX77ccH3k6uq6efPmqVOntuZVREREXLp0qTVTdsTDWxYfH19dXX316tW+ffvec+KhQ4dOnjx50aJFjS6XxCVynzw8PHbv3p2UlLRq1Sr7PmGEuho8ttcZNBqNUCj8+++/AwMD7SOlUilBEDk5OS08sHfv3gCQl5d39116vb6srKxPnz4NRz7xxBM7d+60WCy7du0aMGCAl5dXo0cFBwen31FUVFRRUeEcZ9/FxMTMnz/fmkmt8fHHH6elpTW6mAGXyP1LTEz85JNPVqxYceDAAbJrQahpGHudoUePHvv27QsLC2s4ksvlDhgwYPfu3c1tOgCAq6trVFTUnj177r7r8OHDer3eelqg3aOPPlpWVnb27Nldu3Y1uT+Nw+FE3+Hl5eU0e6LodPq6deuCg4NbOb2/v/9LL720ePFi6/VzVrhEHGLBggVPPPHEk08+efv2bbJrQagJGHtkevnll7OystasWdNwpMFgmDZtmv2kiUWLFp06darR9VUKheKNN96Ij48fMmRIw/E9e/YcNWrUjz/++O+//zY61RA1smzZMo1Gs2HDhoYjcYk4xMaNG93c3GbMmGEymciuBaHG8NgemR599NH58+cvWbIkPT398ccfF4lE2dnZGzduLC4utu8jmj179qlTp55++ulTp05NnjyZz+dnZWV9+umnBoPht99+a3gkyWr69Olz584dOnSou7t7O0rSarWpqakNxwQEBFj7FL37LgCg0Wj9+/dv35zb9HCHEwqF77333quvvtpwJC4RhywRHo+3a9euhISEDz74ABtwQV0OeZcMIptdu3YNHz68Z8+eLi4u9qawGk2zY8eOYcOGubq6cjickJCQN998s6Kiwn7vpEmTZsyYYb2tVqu5XO63335r/feXX36B5i+ObmTSpEl3f0Ks1243eRcA0On0RjNp7uLoVj7csRpdrm5/l6yMRqO14RX75epWuEQc4ssvvyQIIiUlxVEzRMghsAcGhFCHsFgsU6ZMuXTpUkZGhlAoJLschGzw2F6HaKEdEIQownoNu06nW7RoEdm1IFQPj+053vr1699+++3+/fu33GjIypUrf/rpp06rqitbvnz59OnTHTW32traW7duKRSKWbNmOWqelJKQkLBlyxaHzMrV1fXrr7+eNGnS+PHjp0yZ4pB5InSfcCeng5nN5sGDB48ePdreJFVz0tPTc3NzO6eqLi42NjYgIMBRc3vhhRdSUlKOHj165swZR82TUtzc3JKSkhw4w9mzZx88eDAzM9PNzc2Bs0WofTD2HE+n0zGZzLvP6EOdo6CgICwsbNWqVbhvrYuQy+WRkZFDhw798ccfya4FIYw95Iz27duXmJjo6upKdiHI5sCBA+PGjfv7779HjBhBdi2I6jD2EEKdYerUqZmZmZmZmfb+7hEiBe6IQwh1hvXr11dWVq5evZrsQhDVYewhhDqDVCp95513Pvzww2vXrpFdC6I03MnpAEajkcHAS0EQugeTyZSQkMDn848fP+4EjW6jbgq39u7X0aNHw8LCqqqqyC4Eoa6OTqd//fXXp0+f3rZtG9m1IOrC2LsvCoXi6aef7tu3L5402JXdvHnz5MmTZFeBAAD69ev3/PPPv/LKK/hLEZEFY+9+jR8//ttvvyW7CtSSjz/+eOrUqUVFRWQXggAAVq1axWazlyxZQnYhiKLw2B5yfhqNJjExccSIEZ999hnZtSAAgJ07d86YMePixYvR0dFk14IoB2MPUUJxcbG7uzueedRFWCyWIUOGMJnMY8eOkV0LohyMPYQQCVJTUwcOHLh3796HH36Y7FoQtWDsIYTIMW3atCtXrmRmZuJWOOpMeEoLQogca9asuXnz5qZNm8guBFELbu21mUaj4fF4ZFeBkDNYtGjR9u3bc3Nzsft11Glwa69trl275u3tnZ6eTnYh6H7dunUL+zsk3fLly81m85o1a8guBFEIbu21gcViGTFihFKpTE1NpdPpZJeD7svUqVPT09NPnjzp5eVFdi2U9sknnyxbtiw7O9vb25vsWhAlYOy1gclk+vzzz4cPHx4bG0t2Leh+VVdXDx8+PD4+fvPmzWTXQmk6nS4sLCwpKem7774juxZECRh7iLqqqqp4PB6HwyG7EKrbunXr008/ffXq1eDgYLJrQc4PYw8hRDKTydS3b9/ExMQffviB7FqQ88NTWhBCJKPT6UuXLv3xxx+zs7PJrgU5P9zaQwiRz2QyhYeHJyQkbNmyhexakJPDrT2E/sNkMpFdAhXR6fRly5Zt374dN/hQR8PYQ6ieQqGIi4v7/vvvyS6EipKTk4OCgt5//32yC0FODmPvHr788svnn3+e7CpQJxEKhePGjZs7dy6eW9H56HT622+/vWPHjuvXr5NdC3JmeGyvJUqlMjAwcM6cOR999BHZtaDO88svv4waNUokEpFdCOWYTKaIiIiYmJjt27eTXQtyWhh7LcnMzJw3b97+/fslEgnZtSBECT/99NOsWbNu3Ljh7+9Pdi3IOWHsIYS6EJPJFBISMmbMmHXr1pFdC3JOeGwPIdSF0On0hQsXfv/995WVlWTXgpwTxh5CrVJUVFRdXU12FZQwd+5cLpe7fv16sgtBzgljD6FWefnll6Ojo0+ePEl2Ic6Py+U+//zzX375pUajIbsW5ITw2B5CrSKTyebOnatSqf7++2+ya3F+FRUVvr6+H3/88fz588muBTkbjD2E2kCtVvP5fLKroIQXXnjh4MGDN27cYDAYZNeCnAru5GwsKyvr/PnzZFeBuijMvE7z2muvFRUV/fbbb2QXgpwNbu019vDDD1dXV6emppJdCEJUN23atFu3buGXETkW1bf2du/eXVVVZf83IyNj//79K1asILEk1O1cuXJFp9ORXYUTWrhwYVpa2rlz58guBDkVqm/thYeH5+bmPvvss6+88oqfnx8AnD59etCgQWTXhboNs9kcEhJCp9M3bNgwfPhwsstxNv369QsLC9u6dSvZhSDnQfWtvZKSEp1O9/XXXwcGBj722GPp6emYeahNCII4ceJERETEvn37yK7FCT3//PM///xzeXk52YUg50HprT2j0chisezvAJPJNBgM/fv3X7p06fjx42k0Grnloe7FaDTiOYcOV1tb6+XltWjRoqVLl5JdC3ISlN7aq6ioaJj6BoMBAC5cuDBx4sTIyMidO3cajUbyqkPdDGZeR+BwOE8//fRXX31l/XoidP8oHXulpaV3j7R2rp2VlbVgwYK8vLxOLwoh9B/z588vLy//888/yS4E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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from IPython.display import Image, display\n",
    "\n",
    "# display(Image(compiled_graph.get_graph(xray=True).draw_mermaid_png()))\n",
    "draw_graph = compiled_graph.get_graph(xray=True)\n",
    "display(Image(draw_graph.draw_png()))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "d2397a98-bc5e-4e7c-b793-9579eca859db",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-07T08:58:20.591262Z",
     "iopub.status.busy": "2025-03-07T08:58:20.591130Z",
     "iopub.status.idle": "2025-03-07T08:58:20.599037Z",
     "shell.execute_reply": "2025-03-07T08:58:20.598652Z",
     "shell.execute_reply.started": "2025-03-07T08:58:20.591249Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>uuid</th>\n",
       "      <th>question</th>\n",
       "      <th>answer</th>\n",
       "      <th>context</th>\n",
       "      <th>doc</th>\n",
       "      <th>qa_type</th>\n",
       "      <th>score</th>\n",
       "      <th>score_reason</th>\n",
       "      <th>dataset</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>380</th>\n",
       "      <td>f6b906f5-212c-49d2-b66d-3b59678358b6</td>\n",
       "      <td>中国与海湾国家合作的四个主要方向是什么？</td>\n",
       "      <td>中国与海湾国家希望成为“共促团结的伙伴”、“共谋发展的伙伴”、“共筑安全的伙伴”和“共兴文明...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>二、三位。\\n（三）未来中海合作将跨入新阶段\\n第一，政策沟通为中海双方深化合作提供契机和基...</td>\n",
       "      <td>large_context</td>\n",
       "      <td>5</td>\n",
       "      <td>问题询问的是具体的合作方向，答案直接给出了明确的四个方面，没有简单地引用原文，而是进行了总结。</td>\n",
       "      <td>train</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>e73a0c9d-d42b-4350-a4c3-b38bf67c68a5</td>\n",
       "      <td>全球贸易增长情况如何？</td>\n",
       "      <td>全球贸易增长乏力。</td>\n",
       "      <td>全球贸易增长乏力，各国生产景气度逐渐回落，内需对经济的拉动作用减弱。</td>\n",
       "      <td>研究院\\n全球经济金融展望报告\\n要点2024年年报（总第57期） 报告日期：2023年12...</td>\n",
       "      <td>detailed</td>\n",
       "      <td>5</td>\n",
       "      <td>问题询问的是全球贸易的实时情况，答案直接给出了评估性的回答，符合要求。</td>\n",
       "      <td>test</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>77</th>\n",
       "      <td>0943b71a-7314-4cef-a7d9-682c7ddc9d7f</td>\n",
       "      <td>2023年10月美国的失业率是多少？</td>\n",
       "      <td>3.9%</td>\n",
       "      <td>10月失业率提高至3.9%</td>\n",
       "      <td>全球经济金融展望报告\\n中国银行研究院 10 2024年\\n模下降2.5%，进口降幅大于出口...</td>\n",
       "      <td>detailed</td>\n",
       "      <td>5</td>\n",
       "      <td>问题询问的是具体的数据，需要实时信息更新，符合优质问题的标准。答案直接给出了数值，无需查找原...</td>\n",
       "      <td>train</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                     uuid              question  \\\n",
       "380  f6b906f5-212c-49d2-b66d-3b59678358b6  中国与海湾国家合作的四个主要方向是什么？   \n",
       "3    e73a0c9d-d42b-4350-a4c3-b38bf67c68a5           全球贸易增长情况如何？   \n",
       "77   0943b71a-7314-4cef-a7d9-682c7ddc9d7f    2023年10月美国的失业率是多少？   \n",
       "\n",
       "                                                answer  \\\n",
       "380  中国与海湾国家希望成为“共促团结的伙伴”、“共谋发展的伙伴”、“共筑安全的伙伴”和“共兴文明...   \n",
       "3                                            全球贸易增长乏力。   \n",
       "77                                                3.9%   \n",
       "\n",
       "                                context  \\\n",
       "380                                 NaN   \n",
       "3    全球贸易增长乏力，各国生产景气度逐渐回落，内需对经济的拉动作用减弱。   \n",
       "77                        10月失业率提高至3.9%   \n",
       "\n",
       "                                                   doc        qa_type  score  \\\n",
       "380  二、三位。\\n（三）未来中海合作将跨入新阶段\\n第一，政策沟通为中海双方深化合作提供契机和基...  large_context      5   \n",
       "3    研究院\\n全球经济金融展望报告\\n要点2024年年报（总第57期） 报告日期：2023年12...       detailed      5   \n",
       "77   全球经济金融展望报告\\n中国银行研究院 10 2024年\\n模下降2.5%，进口降幅大于出口...       detailed      5   \n",
       "\n",
       "                                          score_reason dataset  \n",
       "380    问题询问的是具体的合作方向，答案直接给出了明确的四个方面，没有简单地引用原文，而是进行了总结。   train  \n",
       "3                  问题询问的是全球贸易的实时情况，答案直接给出了评估性的回答，符合要求。    test  \n",
       "77   问题询问的是具体的数据，需要实时信息更新，符合优质问题的标准。答案直接给出了数值，无需查找原...   train  "
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "qa_df.sample(3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "a21195ad-1e2a-4b9b-87d1-08152ba111bc",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-07T08:58:20.599587Z",
     "iopub.status.busy": "2025-03-07T08:58:20.599461Z",
     "iopub.status.idle": "2025-03-07T08:58:20.603426Z",
     "shell.execute_reply": "2025-03-07T08:58:20.602984Z",
     "shell.execute_reply.started": "2025-03-07T08:58:20.599575Z"
    }
   },
   "outputs": [],
   "source": [
    "# result = compiled_graph.invoke({'question': '全球贸易增长情况如何？'})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "8322f0e7-4b96-4b89-81ac-b77fd23c66c5",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-07T08:58:20.603980Z",
     "iopub.status.busy": "2025-03-07T08:58:20.603858Z",
     "iopub.status.idle": "2025-03-07T08:58:20.609520Z",
     "shell.execute_reply": "2025-03-07T08:58:20.609052Z",
     "shell.execute_reply.started": "2025-03-07T08:58:20.603969Z"
    }
   },
   "outputs": [],
   "source": [
    "# result['answer_to_question']"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0ebd6891-663f-4e7f-b3cc-e216e5200407",
   "metadata": {},
   "source": [
    "# 批量预测"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "7c74cb81-b40b-4879-a21c-119c69da291f",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-07T08:58:20.737869Z",
     "iopub.status.busy": "2025-03-07T08:58:20.737672Z",
     "iopub.status.idle": "2025-03-07T08:58:20.743967Z",
     "shell.execute_reply": "2025-03-07T08:58:20.743524Z",
     "shell.execute_reply.started": "2025-03-07T08:58:20.737855Z"
    }
   },
   "outputs": [],
   "source": [
    "test_df = qa_df[(qa_df['dataset'] == 'test') & (qa_df['qa_type'] == 'detailed')]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "bb499307-2063-4c45-bb48-3964d0a13a0c",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-07T08:58:20.744545Z",
     "iopub.status.busy": "2025-03-07T08:58:20.744419Z",
     "iopub.status.idle": "2025-03-07T08:58:20.752504Z",
     "shell.execute_reply": "2025-03-07T08:58:20.752076Z",
     "shell.execute_reply.started": "2025-03-07T08:58:20.744532Z"
    }
   },
   "outputs": [],
   "source": [
    "prediction_df = qa_df[qa_df['dataset'] == 'test'][['uuid', 'question', 'qa_type', 'answer']].rename(columns={'answer': 'ref_answer'})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "eecff687-e417-4161-8200-9e36c518a73e",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-07T08:58:20.753110Z",
     "iopub.status.busy": "2025-03-07T08:58:20.752954Z",
     "iopub.status.idle": "2025-03-07T08:58:20.759390Z",
     "shell.execute_reply": "2025-03-07T08:58:20.758960Z",
     "shell.execute_reply.started": "2025-03-07T08:58:20.753098Z"
    }
   },
   "outputs": [],
   "source": [
    "# prediction_df = baseline_pred_df[baseline_pred_df['score'] == 0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "b30a1f1f-dfbd-4252-bf19-fdee018ca525",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-07T08:58:20.760142Z",
     "iopub.status.busy": "2025-03-07T08:58:20.759874Z",
     "iopub.status.idle": "2025-03-07T08:58:20.766410Z",
     "shell.execute_reply": "2025-03-07T08:58:20.765885Z",
     "shell.execute_reply.started": "2025-03-07T08:58:20.760127Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(100, 4)"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "prediction_df.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "fa03ecaa-3f88-465a-b33e-5d8d0379e4a0",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-07T08:58:20.767154Z",
     "iopub.status.busy": "2025-03-07T08:58:20.766998Z",
     "iopub.status.idle": "2025-03-07T08:58:20.775460Z",
     "shell.execute_reply": "2025-03-07T08:58:20.774844Z",
     "shell.execute_reply.started": "2025-03-07T08:58:20.767139Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>uuid</th>\n",
       "      <th>question</th>\n",
       "      <th>qa_type</th>\n",
       "      <th>ref_answer</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>377</th>\n",
       "      <td>61c25726-912a-4bd4-981c-01e9cfa81951</td>\n",
       "      <td>面对经济增长放缓和全球经济挑战，海湾国家采取了什么措施？</td>\n",
       "      <td>large_context</td>\n",
       "      <td>为了应对经济增长放缓和全球经济挑战，沙特、阿联酋等国政府大力推动绿色经济转型和经济多元化改革...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>228</th>\n",
       "      <td>dc18ddce-a123-45b5-86e2-2ff1378fb6aa</td>\n",
       "      <td>图20的涨跌幅区间是什么时候？</td>\n",
       "      <td>detailed</td>\n",
       "      <td>2023年1月1日至2023年11月15日</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>45</th>\n",
       "      <td>2e253555-a34a-48cb-824b-da74f33a9111</td>\n",
       "      <td>图5展示的是哪个部门的债务率？</td>\n",
       "      <td>detailed</td>\n",
       "      <td>部分发达国家非金融企业部门债务率</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>136</th>\n",
       "      <td>3c0da094-8444-428b-9729-f1caa33e4b06</td>\n",
       "      <td>2023年二季度沙特GDP的同比增长率是多少？</td>\n",
       "      <td>detailed</td>\n",
       "      <td>1.2%</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>291</th>\n",
       "      <td>8bd98bdb-bbf3-443f-a671-3c13416500f4</td>\n",
       "      <td>在《巴黎协定》生效后，中海合作的新能源领域有哪些?</td>\n",
       "      <td>detailed</td>\n",
       "      <td>光伏、风能、绿氢</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                     uuid                      question  \\\n",
       "377  61c25726-912a-4bd4-981c-01e9cfa81951  面对经济增长放缓和全球经济挑战，海湾国家采取了什么措施？   \n",
       "228  dc18ddce-a123-45b5-86e2-2ff1378fb6aa               图20的涨跌幅区间是什么时候？   \n",
       "45   2e253555-a34a-48cb-824b-da74f33a9111               图5展示的是哪个部门的债务率？   \n",
       "136  3c0da094-8444-428b-9729-f1caa33e4b06       2023年二季度沙特GDP的同比增长率是多少？   \n",
       "291  8bd98bdb-bbf3-443f-a671-3c13416500f4     在《巴黎协定》生效后，中海合作的新能源领域有哪些?   \n",
       "\n",
       "           qa_type                                         ref_answer  \n",
       "377  large_context  为了应对经济增长放缓和全球经济挑战，沙特、阿联酋等国政府大力推动绿色经济转型和经济多元化改革...  \n",
       "228       detailed                              2023年1月1日至2023年11月15日  \n",
       "45        detailed                                   部分发达国家非金融企业部门债务率  \n",
       "136       detailed                                               1.2%  \n",
       "291       detailed                                           光伏、风能、绿氢  "
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "prediction_df.sample(5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "9ea63a5c-9a74-4d27-b0b2-102f515c336e",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-07T08:58:20.776246Z",
     "iopub.status.busy": "2025-03-07T08:58:20.776055Z",
     "iopub.status.idle": "2025-03-07T08:58:20.783169Z",
     "shell.execute_reply": "2025-03-07T08:58:20.782645Z",
     "shell.execute_reply.started": "2025-03-07T08:58:20.776228Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0, 0)"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "if 'finished_questions' in locals():\n",
    "    finished_questions = locals()['finished_questions']\n",
    "else:\n",
    "    finished_questions = set()\n",
    "    answer_dict = {}\n",
    "\n",
    "len(finished_questions), len(answer_dict)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "7e86b24f-d5a9-4616-8ace-b4424330a4fc",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-07T08:58:20.784048Z",
     "iopub.status.busy": "2025-03-07T08:58:20.783842Z",
     "iopub.status.idle": "2025-03-07T08:58:20.791154Z",
     "shell.execute_reply": "2025-03-07T08:58:20.790267Z",
     "shell.execute_reply.started": "2025-03-07T08:58:20.784028Z"
    }
   },
   "outputs": [],
   "source": [
    "import time\n",
    "\n",
    "def rag(llm, query, n_chunks=3):\n",
    "    prompt_tmpl = \"\"\"\n",
    "你是一个金融分析师，擅长根据所获取的信息片段，对问题进行分析和推理。\n",
    "你的任务是根据所获取的信息片段（<<<<context>>><<<</context>>>之间的内容）回答问题。\n",
    "回答保持简洁，不必重复问题，不要添加描述性解释和与答案无关的任何内容。\n",
    "已知信息：\n",
    "<<<<context>>>\n",
    "{{knowledge}}\n",
    "<<<</context>>>\n",
    "\n",
    "问题：{{query}}\n",
    "请回答：\n",
    "\"\"\".strip()\n",
    "    chunks = vector_db.similarity_search(query, k=n_chunks)\n",
    "    prompt = prompt_tmpl.replace('{{knowledge}}', '\\n\\n'.join([doc.page_content for doc in chunks])).replace('{{query}}', query)\n",
    "    retry_count = 3\n",
    "\n",
    "    resp = ''\n",
    "    while retry_count > 0:\n",
    "        try:\n",
    "            resp = llm.invoke(prompt).content.strip()\n",
    "            if resp.startswith('<think>'):\n",
    "                resp = resp.split('</think>')[1]\n",
    "            break\n",
    "        except Exception as e:\n",
    "            retry_count -= 1\n",
    "            sleeping_seconds = 2 ** (4 - retry_count)\n",
    "            print(f\"query={query}, error={e}, sleeping={sleeping_seconds}, remaining retry count={retry_count}\")\n",
    "            \n",
    "            time.sleep(sleeping_seconds)\n",
    "    \n",
    "    return resp, chunks"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "02ab765a-2ec1-4f57-a4b2-17ea74f68baa",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-07T08:58:20.792230Z",
     "iopub.status.busy": "2025-03-07T08:58:20.791970Z",
     "iopub.status.idle": "2025-03-07T09:31:32.721828Z",
     "shell.execute_reply": "2025-03-07T09:31:32.721373Z",
     "shell.execute_reply.started": "2025-03-07T08:58:20.792205Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "ef76b2278a4e4cc39001fd29c241991e",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/100 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 报告的发布机构是什么？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '报告的发布机构是中国银行研究院', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 报告的发布机构是中国银行研究院。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 报告的发布日期是什么时候？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '2024年发布的报告', 'missing_information': '报告的发布月份和日期'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 1)===\n",
      "Searching for: 报告的发布月份和日期\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 2)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '报告发布于2024年，是中国银行研究院的32期。', 'missing_information': '报告的具体发布月份和日期；报告的详细内容或背景信息。'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 2)===\n",
      "Searching for: 报告的具体发布月份和日期；报告的详细内容或背景信息。\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 3)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '报告发布于2023年12月12日', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 3)===\n",
      "answer: 报告发布于2024年。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年全球经济增长有什么特点？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '2023年全球经济复苏不均衡，发达经济体增速放缓，新兴经济体增速与2022年大致持平。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2023年全球经济复苏不均衡，发达经济体增速放缓，其中欧元区、英国经济显著下滑。新兴经济体增长与2022年大致持平。总体预计全年GDP增速在2.5%左右。\n",
      "\n",
      "美国经济表现相对较好，未受加息明显冲击，经济增长超预期。政府财政支出和私人消费成为主要驱动力。服务领域需求释放，就业市场稳健，劳动者实际收入保持增长。制造业投资稳定，私人投资触底反弹，对经济增长有提振作用。净出口拖累效应减弱。\n",
      "\n",
      "全球跨境直接投资在2023年继续下行，但降幅较前一年收窄。国际贸易方面，全球货物贸易量和价格指数承压下行，主要经济体出口同比增速下降。荷兰经济分析局数据显示1-8月全球货物贸易量和价格指数均震荡下滑。\n",
      "\n",
      "综上所述，2023年的特点为复苏+分化、发达经济体增长放缓、美国表现出相对较好态势、跨境投资和国际贸易面临压力。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 全球贸易增长情况如何？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '全球货物贸易量和价格指数均承压下行，部分经济体如越南和韩国出现贸易增长。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2023年全球货物贸易量和价格指数均承压下行，主要经济体出口贸易同比增速下降。1-8月，全球货物贸易量指数和价格指数分别比年初下降了0.9个和4.3个百分点。同时，世贸组织预测2023年全球货物贸易增速为近几年最低水平（预测值从7月的5.2%下调至0.8%）。然而，近期东亚、东南亚等主要经济体出口下行趋势有所收窄，显示出企稳迹象。例如，越南和韩国在9-10月实现了出口正增长。\n",
      "\n",
      "预计2024年全球经济复苏将较为疲软，且分化可能加剧。发达经济体面临的“遏通胀和稳增长”两难问题更为突出，货币政策走势将出现分化。随着经济下行压力加大，主要经济体的央行政策利率预计将维持高位，但未来一段时间内可能出现分化趋势。美国消费未受加息影响而保持稳定增长，对经济增长贡献显著；欧洲消费指数整体稳定，但在高利率和通胀的影响下，内需增长动力逐渐减弱。全球服务业PMI指数从二季度开始明显回落，OECD消费者信心指数也连续3个月下滑。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 展望2024年，全球经济复苏的预期如何？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': \"全球经济复苏将依旧疲软且分化加剧。发达经济体面临 '遏通胀和稳增长' 的两难问题，货币政策走势分化；新兴经济体经济有望逐渐企稳，成为稳定全球经济的重要力量。\", 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 预计2024年全球经济复苏将持续疲软，并可能加剧分化。发达经济体将面临“遏通胀和稳增长”的两难问题，货币政策走势分化。相较于新兴市场和发展中经济体，发达经济体面临更大的经济增长压力。欧元区和英国经济表现弱于其他主要发达经济体，但随着增长压力加大，其货币政策可能在2024年上半年转向宽松。美国经济处于下行阶段，存在软着陆与衰退的风险，但实现软着陆的可能性更大。中国经济和其他亚太经济体的走势有望逐渐企稳，成为稳定全球经济的重要力量。需求端的压力预计超过生产端，在高通胀、高利率和高债务背景下，家庭资产负债表状况将变差，紧缩货币政策对需求的影响将进一步显现。然而，一些因素将为经济形成托底作用，包括全球供应链和工业生产的恢复、宏观政策效应释放、跨境投资和证券投资的回升以及中国经济复苏动力增强等。这些稳定因素有助于减缓经济下行幅度，并为全球经济复苏提供支撑。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 哪些热点问题在报告中被提及？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': 'The report discusses hot topics such as global economic governance, regional cooperation, green transformation and energy security in the Middle East, digital economy development, artificial intelligence advancements, and the growth of developing nations.', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 报告中提及的热点问题包括：\n",
      "\n",
      "1. 绿色转型与能源安全对中东地区经济多元化发展的影响，以及沙特阿拉伯、阿联酋和科威特等国推动可再生能源发展的趋势。\n",
      "\n",
      "2. “南南合作”深化及国际性合作峰会（如中国-中亚峰会、金砖国家领导人会晤、“一带一路”国际合作高峰论坛）在维护国家安全、释放经贸合作潜力等方面的作用。\n",
      "\n",
      "3. 中海深化经贸合作对人民币国际化的影响，以及“石油美元”体系下中东石油出口国面临的挑战和需求。\n",
      "\n",
      "4. 居住房地产市场与利率、债务之间的关系，尤其是美国房地产市场的动态及其对金融市场和经济走势的潜在影响。\n",
      "\n",
      "5. 发展中国家在货币合作、组织机制建设方面的进展，包括扩大本币使用范围、签署数字货币合作协议等。\n",
      "\n",
      "6. 绿色化、数字化和智能化提升发展中国家合作的质量，以及相关领域的资金投入与合作框架建立。\n",
      "\n",
      "7. 发展中国家对推动国际治理体系变革的作用和贡献，强调开放合作共赢的特点。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 如何联系报告的研究小组？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '研究院的电话是+86-10-66592780，传真是+86-10-66594040。联系人是王有鑫，邮箱为wangyouxin_hq@bank-of-china.com。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 联系人：王有鑫  \n",
      "电话：010-66594127  \n",
      "邮件：wangyouxin_hq@bank-of-china.com\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年全球经济增长动力如何变化？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '2023年全球经济增长动力发生变化，主要表现为美国经济增速回落，欧元区和英国经济增长大幅下降，新兴经济体增长与2022年大致持平。', 'missing_information': '全球主要发达经济体（如欧洲、美国）的具体增长数据及新兴经济体的详细情况。'}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2023年全球经济增长动力的变化表现为不均衡复苏，发达经济体增速明显放缓，预计全年增长较2022年下降1个百分点。新兴经济体增速与2022年大致持平，但东南亚等出口型经济体和拉美、非洲等大宗商品出口国的增速放缓，中东欧国家经济增速加快。\n",
      "\n",
      "具体到美国，经济增长未受加息影响出现超预期增长，私人消费、政府财政支出及制造业投资对经济增长贡献较大。就业市场稳健，劳动者实际收入保持增长，家庭财务状况良好。然而，2024年预计美国经济将回落后，高利率的滞后影响逐步显现，财政支出提振作用减弱，净出口拖累效应也或将加剧。\n",
      "\n",
      "欧元区和英国则表现出疲软经济表现，GDP环比增速下降或转为负数。欧洲整体经济增长动能不足，在多重因素影响下，包括货币政策紧缩、通胀压力、全球经济放缓导致的出口疲弱等。\n",
      "\n",
      "总体来看，2023年全球经济增长动力在不同地区之间出现分化，发达经济体增长放缓，新兴市场面临更多挑战。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 发达经济体在2023年的增速变化如何？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '发达经济体在2023年预计增速将比2022年下降1个百分点。其中，欧元区和英国的GDP环比增速由正转负，分别下降0.1%和0.03%。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 发达国家的GDP增速明显放缓，预计2023年增速较2022年下降1个百分点。其中，欧元区和英国经济增速大幅下降，美国表现相对较好，但其GDP环比增长折年率在三季度相较于二季度提升了2.8个百分点。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年全球供应链恢复情况如何？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '全球供应链在2023年持续恢复，但生产景气度逐渐回落。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2023年全球供应链持续恢复，但生产景气度逐渐回落。纽约联储全球供应链压力指数降至有记录以来的最低值。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年美元指数的整体走势如何？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '2023年美元指数整体呈高位震荡后逐步走低的趋势。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2023年以来，美元指数始终保持高位，在100-105区间波动。在7月初开始震荡走高，之后逐渐从高位回落。截至2023年11月15日，美元指数为104.4，较年初上涨了0.6%。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 全球经济复苏呈现什么特点？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '全球经济复苏显示出部分国家供应链压力缓解，但生产景气度逐渐下降；内需对增长的拉动作用减弱，尤其是美国消费表现低于预期。', 'missing_information': '全球主要经济体的增长趋势、具体国家的经济表现及政策影响等详细信息。'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 1)===\n",
      "Searching for: 全球主要经济体的增长趋势、具体国家的经济表现及政策影响等详细信息。\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 2)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '全球经济复苏显示出部分国家供应链压力缓解，但生产景气度逐渐下降；内需对增长的拉动作用减弱，尤其是美国消费表现低于预期。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 2)===\n",
      "answer: 全球经济复苏显示出部分国家供应链压力缓解，但生产景气度逐渐下降。内需对增长的拉动作用减弱，尤其是在美国消费表现低于预期的情况下。全球融资环境收紧和经济下行压力对工业生产前景带来较大影响，全球制造业PMI指数明显回落。从需求端看，内需是支撑发达经济体增长的主要动力，但对经济的拉动力逐渐减弱。\n",
      "\n",
      "总体而言，全球经济复苏在一定程度上缓解了供应链的压力，但生产和需求方面面临挑战，特别是工业生产景气度下降、融资环境收紧和消费动力弱化影响经济增长。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年三季度欧元区GDP环比增速是多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '2023年三季度欧元区GDP环比增速'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 1)===\n",
      "Searching for: 2023年三季度欧元区GDP环比增速\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 2)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '2023年三季度欧元区GDP环比增速为-0.1%。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 2)===\n",
      "answer: 2023年三季度欧元区GDP环比增速为-0.1%。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年三季度英国GDP环比增速是多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '2023年三季度英国GDP环比增速为-0.03%', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2023年三季度英国GDP环比增速为-0.03%。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年三季度美国GDP环比增长折年率是多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '2023年三季度美国GDP环比增长折年率为4.9%', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2023年三季度美国GDP环比增长折年率为4.9%。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 哪些地区在2023年预计经济增速加快？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '东南亚地区预计在2023年经济增长有所加快。', 'missing_information': '拉美和非洲新兴经济体的经济增速情况，以及具体国家的增长表现。'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 1)===\n",
      "Searching for: 拉美和非洲新兴经济体的经济增速情况，以及具体国家的增长表现。\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 2)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '东南亚地区预计在2023年经济增长有所加快', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 2)===\n",
      "answer: 东南亚地区预计在2023年经济增长有所加快。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 全球供应链压力指数降至有记录以来最低值的时间点是什么时候？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '全球供应链压力指数降至有记录以来的最低值的时间点是2023年10月底。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 全球供应链压力指数降至有记录以来的最低值的时间点是2023年10月底。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 全球工业生产量何时触及年内低位？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '全球工业生产量于2023年4月触及年内低位。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 全球工业生产量于4月触及年内低位。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 全球制造业PMI指数从什么值降至什么值？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '全球制造业PMI指数从49.9%降至48.8%', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 全球制造业PMI指数从2月份的49.9%降至10月份的48.8%。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2024年的全球经济金融展望报告是由哪个机构发布的？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '2024年的全球经济金融展望报告由中国银行研究院发布。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 全球经济金融展望报告由中国银行研究院发布。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 美国零售和食品销售额10月的环比增速是多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '美国零售和食品销售额10月环比增速为-0.1%', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: -0.1%\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 全球服务业PMI指数从何时开始明显回落？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '全球服务业PMI指数从5月开始明显回落。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 全球服务业PMI指数从二季度（5月）开始明显回落，到10月已降至50.4%，连续5个月下行。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 全球服务业PMI指数在10月份达到了多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '全球服务业PMI指数在10月份达到了50.4%', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 全球服务业PMI指数在10月份降至50.4%。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年三季度美国住宅投资的情况如何？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '美国私人投资在2023年三季度存货及住宅投资恢复增长，带动私人投资增速提升至8.4%（经季调后环比折年率）。', 'missing_information': '具体数值、区域差异或其他相关细节可能需要进一步查询。'}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2023年三季度美国住宅投资恢复增长，带动私人投资增速提升至8.4%（经季调后环比折年率）。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 与2022年底相比，2023年二季度美国非金融企业部门负债率变化了多少个百分点？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '与2022年底相比，2023年二季度美国非金融企业部门负债率变化了多少个百分点？'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 1)===\n",
      "Searching for: 与2022年底相比，2023年二季度美国非金融企业部门负债率变化了多少个百分点？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 2)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '与2022年底相比，2023年二季度美国非金融企业部门负债率的具体数值和变化百分比信息缺失'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 2)===\n",
      "Searching for: 与2022年底相比，2023年二季度美国非金融企业部门负债率的具体数值和变化百分比信息缺失\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 3)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '美国非金融企业部门债务率在2024年6月的报告中有所提及，但具体数值缺失。', 'missing_information': '具体的百分比变化数据缺失'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 3)===\n",
      "Searching for: 具体的百分比变化数据缺失\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 4)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '美国2023年二季度非金融企业部门负债率变化的具体数据缺失'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 4)===\n",
      "Searching for: 美国2023年二季度非金融企业部门负债率变化的具体数据缺失\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 5)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '美国非金融企业部门负债率变化的具体数据需要参考报告中的相关图表或详细分析。'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 5)===\n",
      "Searching for: 美国非金融企业部门负债率变化的具体数据需要参考报告中的相关图表或详细分析。\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 6)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '与2022年底相比，2023年二季度美国非金融企业部门负债率变化了多少个百分点？'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 6)===\n",
      "Searching for: 与2022年底相比，2023年二季度美国非金融企业部门负债率变化了多少个百分点？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 7)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '2023年二季度美国非金融企业部门负债率变化的具体数据'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 7)===\n",
      "Searching for: 2023年二季度美国非金融企业部门负债率变化的具体数据\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 8)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '与2022年底相比，2023年二季度美国非金融企业部门负债率变化了多少个百分点？'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 8)===\n",
      "Searching for: 与2022年底相比，2023年二季度美国非金融企业部门负债率变化了多少个百分点？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 9)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '2023年二季度美国非金融企业部门负债率变化的具体数据'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 9)===\n",
      "Searching for: 2023年二季度美国非金融企业部门负债率变化的具体数据\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 10)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '美国非金融企业部门负债率在2023年二季度的具体变化数据缺失'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 10)===\n",
      "Searching for: 美国非金融企业部门负债率在2023年二季度的具体变化数据缺失\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 11)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '与2022年底相比，2023年二季度美国非金融企业部门负债率变化的具体数据未在提供的背景信息中找到。'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 11)===\n",
      "Searching for: 与2022年底相比，2023年二季度美国非金融企业部门负债率变化的具体数据未在提供的背景信息中找到。\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 12)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '美国商业房地产贷款及估值在2021年第四季度达到历史高点16.4%。2023年第二季度空置率为18.2%，预测到2024年底可能升至19.7%。', 'missing_information': '与2022年底相比，2023年二季度美国非金融企业部门负债率变化了多少个百分点？'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 12)===\n",
      "Searching for: 与2022年底相比，2023年二季度美国非金融企业部门负债率变化了多少个百分点？\n",
      "e: Recursion limit of 25 reached without hitting a stop condition. You can increase the limit by setting the `recursion_limit` config key.\n",
      "For troubleshooting, visit: https://python.langchain.com/docs/troubleshooting/errors/GRAPH_RECURSION_LIMIT, 兜底\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: IMF预测2023年全球投资率将降至多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': 'IMF预测2023年全球投资率将降至26.4%', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: IMF预测2023年全球投资率将下降1.0个百分点至26.4%。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 在哪些因素影响下，并购交易依然疲软？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '全球跨境直接投资持续下行，部分发达国家非金融企业部门债务率上升，全球投资率变化趋势不明朗。'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 1)===\n",
      "Searching for: 全球跨境直接投资持续下行，部分发达国家非金融企业部门债务率上升，全球投资率变化趋势不明朗。\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 2)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '全球跨境直接投资继续下行，降幅收窄。发达经济体投资受加息政策影响较大，国内和跨境投资均承压。', 'missing_information': '具体的哪些因素导致并购交易疲软？'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 2)===\n",
      "Searching for: 具体的哪些因素导致并购交易疲软？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 3)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '私人消费疲软、制造业投资疲弱、美国就业市场降温等因素可能影响并购交易的疲软'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 3)===\n",
      "Searching for: 私人消费疲软、制造业投资疲弱、美国就业市场降温等因素可能影响并购交易的疲软\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 4)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '并购交易疲软可能受到以下因素影响：发达经济体加息政策、国内和跨境投资压力、私人投资增速放缓、制造业和设备投资放缓、房地产市场问题以及企业杠杆率下降。', 'missing_information': '为了更全面地回答这个问题，还需要了解以下信息：跨国公司战略调整的具体情况、并购交易的行业分布及具体案例数据、国际政治经济环境的变化对并购活动的影响程度等。'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 4)===\n",
      "Searching for: 为了更全面地回答这个问题，还需要了解以下信息：跨国公司战略调整的具体情况、并购交易的行业分布及具体案例数据、国际政治经济环境的变化对并购活动的影响程度等。\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 5)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '并购交易疲软可能受包括发达经济体加息政策、投资压力、私人投资增速放缓等多方面因素影响。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 5)===\n",
      "answer: 并购交易疲软可能受到以下因素的影响：\n",
      "\n",
      "1. **发达经济体加息政策**：高利率环境抑制资本流动，增加融资成本，降低了企业进行并购活动的意愿。\n",
      "\n",
      "2. **国内和跨境投资压力**：全球范围内的投资活动承压，导致资金流向更为谨慎，难以形成大规模的并购交易。\n",
      "\n",
      "3. **私人投资增速放缓**：整体经济活动不振，减少了企业的投资预算与动力。\n",
      "\n",
      "4. **制造业和设备投资放缓**：工业领域需求减弱，影响了对设备和固定资产的投资，间接抑制了并购活动。\n",
      "\n",
      "5. **房地产市场问题**：房地产市场的不稳定或调整会影响企业资金分配，减少用于并购的资金来源。\n",
      "\n",
      "6. **企业杠杆率下降**：企业负债水平降低，财务状况更稳健但也可能减少了利用高杠杆进行大规模并购的意愿。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 图5展示的是哪个部门的债务率？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '图5展示的是非金融企业部门债务率。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 图5展示的是非金融企业部门的债务率。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年前8个月全球货物贸易量指数的变化情况如何？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '2023年前8个月全球货物贸易量指数的变化情况'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 1)===\n",
      "Searching for: 2023年前8个月全球货物贸易量指数的变化情况\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 2)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '2023年1-8月全球货物贸易量指数和价格指数均震荡下行。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 2)===\n",
      "answer: 2023年1-8月，全球货物贸易量指数震荡下行，8月数值比1月分别下降了0.9个点。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年全球主要经济体的出口贸易同比增速有何变化？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '2023年发达经济体出口贸易增速普遍下降，预计较2022年下降1个百分点；欧元区和英国GDP环比增速由正转负，美国表现较好；新兴经济体增速与2022年大致持平，中东欧国家增速加快。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2023年全球主要经济体的出口贸易同比增速下降。具体而言，荷兰经济分析局数据显示，2023年1-8月，全球货物贸易量和价格指数均震荡下行，8月数值分别比1月下降了0.9个点和4.3个点。此外，2023年三季度欧元区和英国GDP环比增速由正转负，分别下降0.1%和0.03%，美国GDP环比增长折年率为4.9%，相较于二季度增速高2.8个百分点。从这个信息中可以看出，全球主要经济体的出口贸易同比增速有所下降，其中欧洲和英国等欧元区国家的经济增长放缓更为明显。\n",
      "\n",
      "同时，国际贸易增长的压力也体现在具体的数据变化上，比如越南和韩国在9-10月实现了出口的正增长，结束了一段连续负增长的趋势。这表明尽管部分地区出现了贸易企稳迹象，但总体来看2023年全球货物贸易量承压下行。\n",
      "\n",
      "综上所述，2023年全球主要经济体的出口贸易同比增速呈现出下降趋势，部分国家和地区在经历了长时间的贸易下滑后开始出现改善迹象，但这并未能抵消整体的压力和放缓。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 世贸组织对2023年全球货物贸易增速的预测值是多少百分点?\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '世贸组织对2023年全球货物贸易增速的预测值为0.8%', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 0.8%\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年国际贸易增长预计会达到什么水平?\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '2023年全球货物贸易增速预计为0.8%', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2023年全球货物贸易增速预测值下调至0.8%，为近几年最低水平。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 哪些因素影响了欧元区和英国的经济增长？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '私人消费持续不振、融资条件收紧、企业投资需求低迷、贸易增长乏力、通胀压力缓解但居民生活仍受影响、货币政策紧缩以及劳动力市场就业增长放缓等是欧元区和英国经济增长的主要影响因素。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 影响欧元区和英国经济增长的因素包括：\n",
      "\n",
      "1. **私人消费持续不振** - 消费是经济的重要驱动力，但在欧元区和英国都出现了消费者信心下降、零售额减少以及消费者信心指数远低于长期平均水平的现象。\n",
      "\n",
      "2. **融资条件收紧** - 紧缩的货币政策导致家庭借贷和消费支出增长放缓，影响了整体经济活动。同样地，企业对固定投资贷款的需求也依然低迷。\n",
      "\n",
      "3. **进出口贸易疲软** - 全球市场需求减弱是欧元区出口下降的原因之一；英国出口虽在上半年连续负增长后有所反弹，但整体上仍受到全球市场环境的影响。\n",
      "\n",
      "4. **通胀率持续下降但仍带来压力** - 虽然通胀有缓解趋势，但对居民生活造成较大影响。例如，在英国，以可支配收入衡量的生活标准较疫情前水平低3.5%，且核心通胀保持高位。\n",
      "\n",
      "5. **劳动力市场的弹性与就业增长放缓** - 欧元区在上半年的就业增长速度较快，但随着经济活动疲软，10月的PMI就业指数下降，预示失业率可能上升。\n",
      "\n",
      "6. **全球服务业PMI指数连续5个月下行** - 这反映出全球经济活动整体下滑的趋势，对欧元区和英国等经济体的增长构成压力。\n",
      "\n",
      "7. **财政支持措施逐步退出** - 欧盟委员会预计，随着高利率、信贷紧缩逐渐影响实体经济以及财政刺激政策的减弱，经济增长将持续受到抑制。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2024年全球经济增速预计为多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '2024年全球GDP增速预计为3.0%', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2024年全球经济增速预计为2.5%。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年四季度美国经济增长动力如何变化？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '2023年四季度美国经济增长动力主要体现在私人消费疲软、制造业投资疲弱和就业市场降温等多方面因素。', 'missing_information': '具体的GDP增长数据、制造业投资的具体变化以及更多关于就业市场的详细信息。'}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2023年四季度美国经济增长动力明显回落，更多领域的负面因素开始凸显。具体表现为：\n",
      "\n",
      "1. **私人消费表现疲软**：消费者支出增幅放缓，10月零售和食品销售环比增速由之前两个月的0.7%以上降至-0.1%，私人消费对经济支撑作用减弱。\n",
      "\n",
      "2. **制造业投资和工业产出处于疲弱状态**：三季度企业制造业投资在连续7个季度增长后转为下降，未来可能会进一步回落。ISM制造业PMI指数长期处于萎缩区间，10月数值较上个月大幅下降2.3个百分点。\n",
      "\n",
      "3. **就业市场降温**：10月新增非农就业人数较年内月度均值大幅减少，失业率提高至3.9%，工资增速放缓，在通胀高企背景下，居民可支配收入增长逐渐承压。\n",
      "\n",
      "4. **GDP环比增长折年率**：预计2024年四季度美国GDP环比增长折年率可能会回落至2%左右。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年10月美国ISM制造业PMI指数较上月有何变化？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '美国ISM制造业PMI指数在2023年10月较上月下降了2.3个百分点。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2023年10月美国ISM制造业PMI指数较上个月大幅下降了2.3个百分点。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 目前情况下，哪种可能性更高，美国经济软着陆还是衰退？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '美国经济软着陆的可能性高于衰退，但两者都存在。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 根据全球经济金融展望报告中的内容分析，从当前情况看，“软着陆”发生的可能性要高于衰退。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 小企业信心的现状如何？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '小企业信心的现状信息未在提供的背景信息中找到。'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 1)===\n",
      "Searching for: 小企业信心的现状信息未在提供的背景信息中找到。\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 2)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '欧元区私人消费持续不振，消费者信心指数显著低于长期平均水平；英国居民消费环比下降0.43%，企业对固定投资贷款需求低迷。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 2)===\n",
      "answer: 根据全球经济金融展望报告中的信息片段，并没有直接提供关于小企业信心的具体数据或分析。该报告主要关注了欧元区和英国的经济预测、欧盟对华反补贴调查情况以及美国房地产市场的风险判断等议题，而未专门涉及小企业信心的状态。要了解小企业信心的情况，可能需要查阅专注于中小企业或商业活动信心指数的相关报告或数据。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 8-10月消费者信心指数与长期平均水平相比如何？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '8-10月消费者信心指数与长期平均水平相比显著下降。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 8-10月消费者信心指数持续下降，远低于长期平均水平。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 10月欧元区的PMI就业指数是多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '10月欧元区PMI就业指数为49.4%', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 10月欧元区PMI就业指数为49.4%。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 根据英国预算责任办公室的说法，英国民众生活标准何时会开始恢复？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'NONE', 'useful_information': '', 'missing_information': 'The expected recovery of living standards in the UK according to the UK Budget Responsibility Office is not explicitly stated, as the information provided indicates that living standards are expected to remain below pre-pandemic levels until at least 2024 and may continue beyond that period without a clear indication of full recovery'}\n",
      "router decision: NONE\n",
      "e: 'NONE', 兜底\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 为什么说欧洲央行加息之路基本宣告结束？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '欧洲央行在2023年进行了连续6次加息，但随后多次宣布暂停加息，并且今年已暂停加息三次。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 欧洲央行宣布本轮加息周期结束的主要原因是经济增长和通胀水平双双降温。随着经济下行程度超出市场预期以及通胀水平的下降，欧洲央行认为当前的高利率水平已不再需要通过加息来进一步抑制通胀，因此其货币政策转向以维持或实现2%的通货膨胀目标为主，意味着加息阶段基本完成。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年10月欧元区经济景气指数是多少点?\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '2023年10月欧元区PMI就业指数为49.4%，表明经济活动有所放缓。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2023年10月欧元区的经济景气指数远低于长期平均水平。具体数值未在提供的信息片段中给出。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 预计2023年欧元区的经济增速大概是多少?\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '预计2023年欧元区经济增速将较2022年下降1个百分点。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 预计2023年欧元区的经济增速较2022年下降1个百分点。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年二季度沙特GDP的同比增长率是多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '2023年二季度沙特GDP的同比增长率'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 1)===\n",
      "Searching for: 2023年二季度沙特GDP的同比增长率\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 2)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '2023年二季度沙特GDP的同比增长率为0.8%', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 2)===\n",
      "answer: 2023年二季度沙特GDP同比仅增长1.2%，较上年同期下降约10个百分点。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年9月南非的CPI同比上涨了多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '南非2023年9月CPI同比上涨5.5%', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 8.5%\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2024年预计新兴经济体的整体经济增速是多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '2024年预计新兴经济体的整体经济增速'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 1)===\n",
      "Searching for: 2024年预计新兴经济体的整体经济增速\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 2)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '2024年新兴经济体的整体经济增速预计在3.0%左右。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 2)===\n",
      "answer: 根据报告中的信息，“展望2024年，新兴经济体增长机遇与挑战并存，“南南合作”将成为重要抓手，预计整体经济增速将在4%左右，略高于2023年。”因此，2024年预计新兴经济体的整体经济增速为大约4%，略高于2023年的水平。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 在当前背景下，哪些国家需要发展可再生能源？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '海湾六国（沙特、阿联酋、科威特、巴林、卡塔尔和阿曼）需要发展可再生能源。此外，阿曼也在推动绿色转型。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 海湾六国（沙特、阿联酋、科威特、巴林、卡塔尔和阿曼）面临较大的经济转型需求，由于全球低碳转型加速推进以及国际社会对能源安全的关注增加，这些国家需要发展可再生能源以实现经济多元化。它们通过设定净零目标、推动新能源转型、建设和投资于太阳能、风能、氢能等基础设施，以此来增强国家战略自主性并促进绿色经济发展。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 在2023年的金砖会议上，中国宣布了什么专项资金？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '中国在2023年的金砖会议上宣布了100亿美元的专项资金，用于落实全球发展倡议。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 在2023年的金砖会议期间，中国宣布推出100亿美元的专项资金用于落实全球发展倡议。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2024年美国的GDP增长率预测是多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '美国2024年GDP增长率预测为2%', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 预计2024年美国经济增速将进一步回落，“软着陆”和衰退的可能性同时存在，但从目前情况看，“软着陆”发生的可能性要高于衰退。全球经济金融展望报告指出，综合上述因素，“复苏+分化”将成为2024年全球经济主线逻辑，预计全年经济增速在2.5%左右，增速比2023年低0.2个百分点。\n",
      "\n",
      "因此，2024年美国的GDP增长率预测为约2.3%。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2024年中国的GDP增长率预测是多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '2024年中国GDP增长率预测为3.0%', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 3.0%\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年英国的GDP增长率估计是多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': 'The 2023 GDP growth rate of the UK'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 1)===\n",
      "Searching for: The 2023 GDP growth rate of the UK\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 2)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '预计2023年英国GDP增速比2022年下降0.1个百分点。', 'missing_information': '具体的2023年英国GDP增长率数值。'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 2)===\n",
      "Searching for: 具体的2023年英国GDP增长率数值。\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 3)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '预计2023年英国GDP增速比2022年下降0.1个百分点。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 3)===\n",
      "answer: 预计2023年英国GDP增速比2022年下降0.1个百分点。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 欧洲央行在何时宣布暂停加息？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '欧洲央行在2023年10月26日宣布首次暂停加息。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 欧洲央行在2023年10月26日宣布暂停加息。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 日本央行的基准利率在10月31日维持在多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '日本央行的基准利率在10月31日维持在-0.1%', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: -0.1%\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 英国央行在2023年加息了多少次？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '英国央行在2023年共加息0次。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 英国央行在2023年内连续加息5次。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 美联储在2月1日的基点变动了多少?\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '美联储在2月1日的基点变动为-4.75%', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 美联储在2月1日进行了25个基点的变动。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 欧洲央行在3月16日的利率是多少百分比?\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '欧洲央行在3月16日的利率为+5.0%', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 欧洲央行在3月16日的利率是3.5%。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 英格兰银行在6月22日的利率变动了多少基点?\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': 'In the 2023 year, the Bank of England had rate changes on May 4th (255.0%-5.25%) and June 14th (+5.0% change).', 'missing_information': \"The Bank of England's interest rate movement on June 22, 2023, is not provided in the available data\"}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 1)===\n",
      "Searching for: The Bank of England's interest rate movement on June 22, 2023, is not provided in the available data\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 2)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '英格兰银行在6月22日将利率从505%降至255.25%，下降了250基点。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 2)===\n",
      "answer: 英格兰银行在6月14日的利率变动为+5.0%，而在6月22日的利率变动为未直接给出，但根据上下文可以推断出是在6月14日基础上再次增加50个基点至5.25%。因此，从6月14日至6月22日的变动是+50个基点。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 美国金融危机风险指标的英文缩写是什么？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': 'ROFCI是美国金融危机风险指标的英文缩写.', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 美国金融危机风险指标的英文缩写是ROFCI（Risk of Financial Crisis Indicator）。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年，欧元区M3、M2和M1的同比增速情况是否提及？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': 'The M3, M2 and M1 money supply growth rates in the eurozone for 2023'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 1)===\n",
      "Searching for: The M3, M2 and M1 money supply growth rates in the eurozone for 2023\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 2)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '欧元区M3、M2和M1的同比增速情况'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 2)===\n",
      "Searching for: 欧元区M3、M2和M1的同比增速情况\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 3)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '欧元区M3、M2和M1的同比增速情况'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 3)===\n",
      "Searching for: 欧元区M3、M2和M1的同比增速情况\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 4)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '欧元区M3、M2和M1的同比增速情况未提及'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 4)===\n",
      "Searching for: 欧元区M3、M2和M1的同比增速情况未提及\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 5)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '背景信息提到了欧元区广义货币增速的数据。', 'missing_information': '欧元区M3、M2和M1的同比增速的具体数值或详细情况未提及。'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 5)===\n",
      "Searching for: 欧元区M3、M2和M1的同比增速的具体数值或详细情况未提及。\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 6)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': 'The M3, M2 and M1 money supply growth rates in the Eurozone for 2023'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 6)===\n",
      "Searching for: The M3, M2 and M1 money supply growth rates in the Eurozone for 2023\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 7)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '欧元区M3、M2和M1的同比增速情况'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 7)===\n",
      "Searching for: 欧元区M3、M2和M1的同比增速情况\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 8)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '欧元区M3、M2和M1的同比增速情况未提及'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 8)===\n",
      "Searching for: 欧元区M3、M2和M1的同比增速情况未提及\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 9)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '背景信息提到了欧元区广义货币增速的数据。', 'missing_information': '欧元区M3、M2和M1的同比增速的具体数值或详细情况未提及。'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 9)===\n",
      "Searching for: 欧元区M3、M2和M1的同比增速的具体数值或详细情况未提及。\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 10)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '欧元区M3、M2和M1的同比增速情况未提及'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 10)===\n",
      "Searching for: 欧元区M3、M2和M1的同比增速情况未提及\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 11)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '欧元区M3、M2和M1的同比增速情况未提及'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 11)===\n",
      "Searching for: 欧元区M3、M2和M1的同比增速情况未提及\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 12)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '背景信息提到了欧元区广义货币增速的数据。', 'missing_information': '欧元区M3、M2和M1的同比增速的具体数值或详细情况未提及。'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 12)===\n",
      "Searching for: 欧元区M3、M2和M1的同比增速的具体数值或详细情况未提及。\n",
      "e: Recursion limit of 25 reached without hitting a stop condition. You can increase the limit by setting the `recursion_limit` config key.\n",
      "For troubleshooting, visit: https://python.langchain.com/docs/troubleshooting/errors/GRAPH_RECURSION_LIMIT, 兜底\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年瑞士法郎对美元的升值幅度是多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '2023年瑞士法郎对美元的升值幅度为4.2%', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 4.2%\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 美元的走势如何变化？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '美元指数在2023年初处于100-105区间波动，7月初开始震荡走高，至11月15日为104.4，较年初上涨0.6%。预计2024年美元指数可能呈现高位震荡后走弱的趋势。', 'missing_information': '2024年美元指数的具体走势和汇率市场的波动情况需要进一步信息来补充。'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 1)===\n",
      "Searching for: 2024年美元指数的具体走势和汇率市场的波动情况需要进一步信息来补充。\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 2)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '美元指数在2023年初处于100-105区间波动，7月初开始震荡走高，至11月15日为104.4，较年初上涨0.6%。预计2024年美元指数可能呈现高位震荡后走弱的趋势。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 2)===\n",
      "answer: 美元在2023年初至7月初处于100-105区间波动后开始震荡走高，至11月15日为104.4，较年初上涨了0.6%。预计2024年美元指数可能呈现高位震荡后逐步走弱的趋势，在保持一段时间的强势后将随着美联储货币政策转向而走弱，尤其是下半年汇率将呈现贬值态势。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 市场对美联储的预期是什么？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '市场对美联储未来政策的详细预期，包括可能的利率调整和货币政策方向，尚未在背景信息中明确提及。'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 1)===\n",
      "Searching for: 市场对美联储未来政策的详细预期，包括可能的利率调整和货币政策方向，尚未在背景信息中明确提及。\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 2)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '市场普遍预计美联储将逐步转向降息政策，尤其是美联储可能在2024年调整货币政策，并且认为加息周期可能结束。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 2)===\n",
      "answer: 当前市场基本共识为：\n",
      "\n",
      "1. 当前的货币政策已经达到“限制性”水平；\n",
      "2. 美联储加息周期接近尾声，预计在2024年调整货币政策；\n",
      "3. 若无特殊风险事件发生，美联储可能在2024年维持当前缩表（QT）节奏。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 欧元和英镑的汇率会怎样？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '欧元和英镑汇率预计震荡回落，下半年将企稳回升。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 预计2024年欧元和英镑汇率将震荡回落，下半年企稳回升。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 哪个行业的涨幅在2023年1月1日至2023年11月15日期间最高？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '信息科技板块的涨幅最高，达到41.1%', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 信息片段显示，截至2023年11月15日，信息科技MSCI指数的涨幅高达41.1%，远高于电信业务（31.5%）、非日常消费品（21.5%）等板块。因此，在该期间内，信息科技行业的涨幅最高。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 图20的涨跌幅区间是什么时候？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '图20的详细信息未在提供的背景信息中找到'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 1)===\n",
      "Searching for: 图20的详细信息未在提供的背景信息中找到\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 2)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': \"The graph's time frame\"}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 2)===\n",
      "Searching for: The graph's time frame\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 3)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '图20的涨跌幅区间'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 3)===\n",
      "Searching for: 图20的涨跌幅区间\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 4)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '图20的涨跌幅区间'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 4)===\n",
      "Searching for: 图20的涨跌幅区间\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 5)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '图20的涨跌幅区间'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 5)===\n",
      "Searching for: 图20的涨跌幅区间\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 6)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '图20的涨跌幅区间'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 6)===\n",
      "Searching for: 图20的涨跌幅区间\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 7)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '图20的涨跌幅区间信息未在提供的背景信息中找到'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 7)===\n",
      "Searching for: 图20的涨跌幅区间信息未在提供的背景信息中找到\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 8)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '图20的涨跌幅区间'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 8)===\n",
      "Searching for: 图20的涨跌幅区间\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 9)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '图20的涨跌幅区间信息缺失'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 9)===\n",
      "Searching for: 图20的涨跌幅区间信息缺失\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 10)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '关于图20的具体信息未在提供的背景信息中找到。建议提供图20的详细信息或相关图表数据，以便进一步分析。'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 10)===\n",
      "Searching for: 关于图20的具体信息未在提供的背景信息中找到。建议提供图20的详细信息或相关图表数据，以便进一步分析。\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 11)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '图20的涨跌幅区间的具体年份或时间段'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 11)===\n",
      "Searching for: 图20的涨跌幅区间的具体年份或时间段\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 12)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '图20的涨跌幅区间为2023年1月1日至2023年11月15日。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 12)===\n",
      "answer: 图20的涨跌幅区间为2023年1月1日至2023年11月15日。\n",
      "e: Recursion limit of 25 reached without hitting a stop condition. You can increase the limit by setting the `recursion_limit` config key.\n",
      "For troubleshooting, visit: https://python.langchain.com/docs/troubleshooting/errors/GRAPH_RECURSION_LIMIT, 兜底\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年美国国债的发行规模相比于2022年有什么变化？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '美国国债的发行规模在2023年较2022年下降了9.9%', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2023年前10个月，美国债券市场的融资规模为71414亿美元，同比下降9.9%。其中，包括美国国债在内的一些产品的发行规模出现了下降。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 公司债的发行规模变化如何？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '美国公司债券的发行规模在2023年呈现上升态势。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 公司债的发行规模在2023年呈现上升态势。具体而言，在全球货币政策趋紧背景下，2023年前10个月美国债券市场的融资规模整体下降8.8%，但公司债发行规模较去年同期增长2.5%。这表明相较于其他类型的证券如住房按揭抵押证券、资产支持证券等出现显著下降情况，公司债的发行表现相对稳定且略有增长。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 截至11月15日，英国的10年期国债收益率是多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '英国的10年期国债收益率为4.19%', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 4.19%\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年10月以来，主要经济体的货币政策有什么变化？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '2023年10月起，美联储加息4次累计100个基点；欧洲央行在2023年第四季度暂停加息；日本央行继续实施超宽松货币政策并可能于2024年退出负利率政策。', 'missing_information': '未来主要经济体的货币政策走向和具体影响因素。'}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2023年10月以来，主要发达经济体货币政策总体逐步放缓并暂停加息。美联储在10月议息会议中连续三次暂停加息；欧洲央行宣布维持三大利率不变，为2022年7月以来首次暂停加息；英国央行也于9月首次暂停加息，并连续两次暂停。与发达经济体相反的是部分新兴经济体在四季度进一步提升利率水平。\n",
      "\n",
      "综上所述，主要发达经济体的货币政策出现拐点，由持续收紧转向逐步放缓并暂停加息，而一些新兴经济体则继续上调利率。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 美欧加大国债发行力度可能导致什么后果？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '美欧加大国债发行力度可能导致高利率环境抑制债券融资需求、增加财政体系脆弱性以及发展中国家面临主权债务风险。', 'missing_information': '具体的经济指标和政策细节，例如具体的国债发行规模、利率变化趋势等。'}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 美欧加大国债发行力度可能会增加财政体系的脆弱性，并提高部分发展中国家发生主权债务危机的风险，因为这些国家可能拥有大量美元债务。这将对外偿付能力产生不利影响，从而导致潜在的主权债务问题。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 11月16日NYMEX天然气的价格是多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '11月16日NYMEX天然气价格升至3.1美元/百万英热', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 11月16日，NYMEX天然气价格升至3.1美元/百万英热。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 图25显示了什么价格的走势？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '图25显示的是COMEX黄金期货价格走势。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 图25显示了COMEX黄金期货价格的走势。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 海湾六国经济增长受什么影响较大？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '海湾六国经济增长受国际能源价格走势影响较大，同时面临经济转型需求增加的挑战。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 海湾六国经济增长受国际能源价格走势影响较大。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: IMF预测2023年海湾六国的平均经济增速是多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': 'IMF预测2023年海湾六国的平均经济增速为1.7%', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: IMF在最新展望报告中将海湾六国2023年经济增速下调0.8个百分点至1.7%。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 海湾六国经济结构的主要问题是什么？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '海湾六国经济结构的主要问题是过度依赖传统能源导致工业发展和科技创新动力不足。', 'missing_information': '海湾六国在应对全球能源危机和推动绿色经济转型方面仍需进一步努力，以实现经济多元化和可持续发展。'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 1)===\n",
      "Searching for: 海湾六国在应对全球能源危机和推动绿色经济转型方面仍需进一步努力，以实现经济多元化和可持续发展。\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 2)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '海湾六国经济结构的主要问题是过度依赖传统能源导致工业发展和科技创新动力不足。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 2)===\n",
      "answer: 海湾六国经济结构的主要问题是过度依赖传统能源，这导致工业发展和科技创新动力不足。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 为什么海湾六国需要进行经济转型?\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '海湾六国需要进行经济转型主要是因为过度依赖石油导致工业和科技创新动力不足，全球能源危机加剧这种压力，并推动绿色低碳发展。此外，海湾六国外商直接投资流入领域逐渐多元化，显示经济转型的趋势。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 海湾六国需要进行经济转型，主要原因是国际形势变化加大了其经济转型的需求。长期以来，石油和天然气等传统能源是海湾六国经济发展的重要动力，但过度依赖这些资源在一定程度上限制了工业发展和科技创新能力。随着全球低碳转型的加速推进以及对能源安全的关注增加，海湾六国面临较大的经济转型需求。\n",
      "\n",
      "1. **能源多样化需求**：全球能源危机促使主要经济体加快推动能源多元化发展，减少对传统石油的需求。\n",
      "2. **应对气候变化**：全球社会认识到应对气候变化的重要性，这加速了全球能源结构的变革，新能源逐步挤占传统能源份额。\n",
      "3. **《联合国气候变化框架公约》COP28会议**：2023年11月末在阿联酋迪拜举办的联合国气候变化大会（COP28）进一步为中东国家指明可再生能源发展新方向。\n",
      "\n",
      "这些因素促使海湾六国需要通过绿色经济发展和推进新能源转型，增强国家战略自主性，并促进经济多元化。此外，外国直接投资流入领域的日益多元化也是释放经济转型信号的体现之一。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 沙特的全面绿色倡议包含哪些项目？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '沙特启动了全面绿色倡议，包括启动NEOM项目，计划每年减少约2000万吨碳排放；还有13个可再生能源项目；以及通过马斯达尔开发氢能，计划到2031年氢气年产量达140万吨。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 沙特的全面绿色倡议包括以NEOM为中心的大规模绿氢和绿氨生产项目，以及13个可再生能源项目。这些计划旨在减少碳排放，其中计划每年减少约2000万吨碳排放，并目标到2031年实现氢气年产量达140万吨，其中100万吨为绿氢。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2022年阿联酋的外商直接投资规模是多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '2022年阿联酋的外商直接投资规模为248.3亿美元', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 248.3亿美元\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2022年阿联酋对外直接投资的增长率是多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': \"The growth rate of UAE's direct foreign investment in 2022\"}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 1)===\n",
      "Searching for: The growth rate of UAE's direct foreign investment in 2022\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 2)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '2022年阿联酋对外直接投资同比增长率为10%', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 2)===\n",
      "answer: 248.3亿美元\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 中国在全球石油消费中的地位是什么?\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '中国是中国全球最大的石油消费国和最大的石油进口国。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 中国是全球第二大石油消费国。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 在《巴黎协定》生效后，中海合作的新能源领域有哪些?\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '中海合作在新能源领域包括光伏、风能和绿氢开发。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 中海合作的新能源领域包括光伏、风能、绿氢等清洁能源开发。中国和海湾六国在技术应用上均处于领先地位，未来可加强项目对接，发挥互补优势，在这些领域深化务实合作，实现共同发展。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 美联储加息如何影响美国居住房地产市场？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '美联储加息导致美国居住房地产市场的贷款成本上升，从而减少了潜在的购房需求。同时，高利率也增加了居民债务负担，进一步影响了房地产市场的发展。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 美联储加息通过提高房贷利率来影响美国居住房地产市场。这导致30年期住房抵押贷款固定利率从历史低位（2023年10月为7.6%）上升，远高于次贷危机前的水平（约6.5%）。尽管与次贷危机时期相比，当前市场的整体稳定性相对较好，但高利率环境增加了金融脆弱性。具体影响包括：\n",
      "\n",
      "1. **住房贷款质量稳定**：虽然单一家庭房贷的总体拖欠率已从2023年二季度的2.1%下降至历史水平以下（3.9%）和次贷危机时期的峰值（11.5%），但在高利率环境下，新拖欠率出现上升趋势。\n",
      "   \n",
      "2. **住房市场需求**：过去两年美国居住房地产价格经历了两位数增长。美联储可能在2024年开始降息，预期房贷利率会随之下降，这对住房市场的需求起到一定支撑作用。\n",
      "\n",
      "3. **人口老龄化和需求减弱**：美国人口年增长率已从1.2%降至0.5%，并呈现出进一步下降趋势，这表明住房需求难以重现疫情初期的强劲状态。穆迪预测未来两年美国房价可能下跌约4.5%，反映了需求减弱的影响。\n",
      "\n",
      "4. **商业房地产市场影响有限**：尽管面临长期结构性因素冲击（如远程办公和网上购物导致的需求减少），以及经济下行的压力，居住房地产市场相对稳定，但高利率环境下潜在风险上升。商业房地产市场，特别是办公楼宇的空置率出现上升趋势，预计未来空置率将进一步攀升。\n",
      "\n",
      "5. **家庭债务负担**：美国居民全部债务支出与可支配收入的比例在疫情后从8.3%升至9.97%，随后回落至9.8%，但仍低于历史水平和次贷危机时期的峰值。这表明尽管债务负担加重，但整体上家庭财务状况未达到危机阶段的脆弱性。\n",
      "\n",
      "综上所述，美联储加息对美国居住房地产市场产生了直接的影响，通过提高房贷利率来抑制需求，并增加金融系统的不确定性。同时，人口老龄化和经济活动的变化也影响了房地产市场的长期前景。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 目前美国居住房地产市场的市值余额是多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'INCOMPLETE', 'useful_information': '', 'missing_information': '美国居住房地产市场的市值余额'}\n",
      "router decision: INCOMPLETE\n",
      "\n",
      "=== STEP 2b: FINDING MISSING INFORMATION (round: 1)===\n",
      "Searching for: 美国居住房地产市场的市值余额\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 2)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '美国居住房地产市场的市值余额为56.3万亿美元。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 2)===\n",
      "answer: 目前美国居住房地产的市值余额为56.3万亿美元。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 在美国居民的债务结构中，房贷所占比例是多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '美国居民的房贷所占债务结构约为46%', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 美国居民全部债务支出中，房贷债务长期维持在4%左右的比例。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 美联储加息对美国房地产市场风险排名产生了什么影响？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '美联储加息导致美国房地产市场的贷款需求下降、商业房地产抵押证券新发放量停滞不前，并可能进一步加剧市场风险。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 根据全球经济金融展望报告中的内容，美联储加息对美国房地产市场产生的影响主要体现在以下几个方面：\n",
      "\n",
      "1. **房贷质量稳定但存在上升趋势**：美国单一家庭房贷的整体拖欠率在2023年有所下降，但仍受到高利率环境的影响。新增房贷的拖欠率出现上升趋势，这表明随着利率的上升，住房贷款市场的稳定性受到了威胁。\n",
      "\n",
      "2. **房地产价格下跌预期**：预计未来两年内，美国的住房价格将从峰值下跌约4.5%。这一预测是基于穆迪的分析和对人口老龄化以及低出生率趋势的考虑。这意味着房价下跌的风险在增加。\n",
      "\n",
      "3. **商业房地产市场压力增大**：\n",
      "   - 高利率环境导致贷款需求下降，2023年商业房地产贷款新发放量预计将同比下降46%，且商业房地产抵押证券（CMBS）的新发行出现停滞。\n",
      "   - 商业房地产价格指数从历史高点显著下跌，反映出市场的冷却和对未来的担忧。与次贷危机时期相比，尽管有轻微改善但仍显示出较大压力。\n",
      "\n",
      "4. **金融资产质量开始下降**：银行业商业房地产贷款的拖欠率上升，CMBS的拖欠率也有明显增长，特别是在办公楼宇部分，这表明信贷风险正在增加。\n",
      "\n",
      "5. **未来金融风险可能升高**：2023-2024年期间，美国商业房地产面临9000亿美元债务到期的压力。这些到期债务大部分集中在办公楼相关领域，增加了再融资的成本和难度，并对市场稳定性构成了威胁。\n",
      "\n",
      "6. **中小型银行的风险敞口更高**：由于大型银行在资产中所占比例较低（仅占6.4%），而中小银行占比高达70%，因此它们在商业房地产贷款风险上暴露更多。这种结构特征使得风险更加集中。\n",
      "\n",
      "综上所述，美联储的加息政策对美国房地产市场产生了多方面的影响，包括但不限于房贷市场的稳定但存在压力、住房价格预期下跌、商业房地产市场冷却以及信贷和金融稳定性面临的潜在风险增加等。这些因素共同作用于市场，增加了未来金融风险的不确定性。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 在居住房贷中，哪种类型的贷款占比较大？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '在居住房贷中，10-30年期固定利率抵押贷款占比超过65%。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 在居住房贷中，10-30年期固定利率类占比达89%，且绝大部分为30年房贷。这意味着债务人月供负担低，加息不会增加存量房贷还款负担，并且新增房贷数量仍较有限。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: John Burns研究与咨询公司的调查结果显示，多少比例的计划购房者表示房贷利率高于5.5%就不再愿意购房？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '71%的计划购房者表示房贷利率高于5.5%则不愿购房', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 71%\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 在2024年美联储可能做什么？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '美联储可能在2024年调整货币政策，包括加息和缩表。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2024年美联储可能调整货币政策，并在没有特殊风险事件发生的情况下，维持当前的缩表（QT）节奏。市场共识认为，美联储加息周期接近尾声，且当前的货币政策已经达到“限制性”水平。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 美国单一家庭房贷整体拖欠率在2023年二季度达到多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '美国单一家庭房贷整体拖欠率在2023年二季度达到1.7%', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 1.7%\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 疫情后美国商业房地产价格在2021年四季度的季度同比增幅是多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '美国商业房地产价格在2021年四季度的季度同比增幅为16.4%', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 疫情后美国商业房地产价格在2021年四季度的季度同比增幅达到了16.4%的历史高点。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年二季度，银行业的商业房地产贷款拖欠率是多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '银行业的商业房地产贷款在2023年二季度的拒收率为0.8%', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2023年二季度，银行业的商业房地产贷款拖欠率为0.8%。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 商业房地产贷款在中小型银行资产中的占比大约是多少？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '商业房地产贷款在中小型银行资产中的占比为70%，在中小银行资产中占比为29%', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 商业房地产贷款在中小银行资产中占比达29%。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 对于2024年发达经济体的货币政策有什么预测？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '发达经济体的货币政策预测显示，美联储可能在2024年上半年停止加息，欧洲央行和英国央行也可能暂停加息。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2024年预计全球经济复苏将依然疲软且分化加剧。发达经济体面临“遏通胀和稳增长”的两难问题，货币政策走势将分化：\n",
      "\n",
      "- 美联储可能在上半年停止加息。\n",
      "- 日本央行可能于2024年初退出负利率政策。\n",
      "\n",
      "主要央行对通胀走势保持警惕，预计在一段时间内政策利率将继续维持高位。然而，随着经济下行压力加大，主要经济体央行的货币政策走势将逐渐分化，有近1/5的央行处于降息周期中。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 欧盟在认定补贴属于可诉性补贴后，可能会采取哪些措施？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '欧盟在认定补贴属于可诉性补贴后，可能会采取加征反补贴税或要求出口商接受价格承诺的措施。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 欧盟在认定补贴属于可诉性补贴后，可能采取的反补贴措施包括：\n",
      "\n",
      "1. **加征反补贴税**：针对不同类型的涉事企业，可能适用不同的加征税率。被认定为不合作的企业将面临最高税率。\n",
      "\n",
      "2. **出口商接受价格承诺**：要求出口商以不低于特定的价格进行出口，作为替代反补贴税的一种方式。\n",
      "\n",
      "这些措施通常实施期限为五年。若欧盟认定补贴未对当地产业造成损害、补贴规模轻微，或申请方撤诉，则可能采取无措施结案的决定。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2023年全球发展中国家在哪些重要的国际会议上展露出活跃的表现？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '2023年全球发展中国家在第23届上海合作组织元首理事会会议、中国－中亚峰会、金砖国家领导人第十五次会晤和‘一带一路’国际合作高峰论坛上表现出活跃表现。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2023年，全球发展中国家在以下几个重要国际会议上展现出活跃表现：\n",
      "\n",
      "1. 上海合作组织（上合组织）成员国元首理事会第二十三次会议；\n",
      "2. 中国-中亚峰会；\n",
      "3. 金砖国家第十五次领导人会晤（金砖会议）；\n",
      "4. 第三届“一带一路”国际合作高峰论坛。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2024年美联储的货币政策预期如何？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '2024年美联储预计将继续采取缩表政策，并可能在年初启动加息周期，逐步转向紧缩货币政策。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2024年美联储的货币政策预期包括以下几点：\n",
      "\n",
      "1. 当前的货币政策已达到“限制性”水平；\n",
      "2. 加息周期接近尾声，预计会在年内调整政策；\n",
      "3. 若无特殊风险事件，可能维持当前的缩表（QT）节奏。然而，高利率持续时间和首次降息时点仍不确定，以及货币政策“滞后效应”对经济的影响存在不确定性。\n",
      "\n",
      "关键在于，美联储正逐渐调整其紧缩立场，并准备在2024年结束加息周期，但具体的政策转向时间和力度仍然有待观察。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 2024年全球资金状况和货币市场基金的前景如何？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': \"2024年全球资金状况方面，主要经济体将结束加息周期，资金流动性呈现'紧平衡'状态；货币市场基金面临挑战，去存款化特征较为突出，规模增速可能放缓。跨境资本流动趋势可能发生变化。\", 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 2024年，全球经济将面对“资金紧平衡”的状态，这导致了货币市场的短期资金成本显著上升。在这一背景下：\n",
      "\n",
      "1. **资金“紧平衡”**：主要经济体结束加息周期后，资金流动性趋于减少，资金调剂功能的重要性增加。美元SOFR、欧元€STR和英镑SONIA等基准利率将维持高位或小幅回落，而日元TONA可能从负值区域转为正值。这表明货币市场交易活动依然活跃，但短期资金成本升高。\n",
      "\n",
      "2. **“去存款化”趋势**：尽管主要经济体广义货币增速有望提升，美欧证券回购市场呈现“现券供给充裕、资金相对紧张”的特征，个别时点可能出现“钱荒”。全球基准利率改革后，银行间拆借市场的短期资金筹措功能下降。美国证券交易委员会对货币市场基金的新规将限制其规模的快速增长，尤其是优质货币市场基金。\n",
      "\n",
      "3. **跨境资本流动**：2024年，跨境资本回流美国的趋势预计放缓，日本可能退出负利率政策。欧元区将延续资本净流出态势，而日本的跨境资本净流出有望减少。全球范围内，资金流向新兴经济体的速度有望加快，但流向仍以组合投资和非储备性质金融账户为主。\n",
      "\n",
      "**货币市场基金前景**：\n",
      "- 高利率环境下的挑战：在资金“紧平衡”与高利率环境下，货币市场基金面临一定压力。\n",
      "- 结构性变化：跨境资本流动结构可能发生变化，导致资金重新配置，影响包括货币市场基金在内的各类金融机构和市场的流动性。\n",
      "\n",
      "整体而言，2024年全球资金状况将维持紧张态势，并对金融市场产生结构性影响，尤其是在货币市场基金领域。投资者需关注相关政策变动及经济周期的转变来调整策略。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 面对经济增长放缓和全球经济挑战，海湾国家采取了什么措施？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '海湾国家采取了绿色经济转型、经济多元化改革以及扩大对华直接投资等措施。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 针对经济增长放缓和全球经济挑战，海湾六国政府主要采取以下策略：\n",
      "\n",
      "1. **绿色经济转型**：推动经济多元化，减少对石油、天然气等传统能源的依赖。沙特和阿联酋等国加强绿色经济改革，旨在稳定经济发展。\n",
      "\n",
      "2. **经济结构优化**：重点发展非石油部门，促进公私合作伙伴关系并放宽对外资限制。如阿美公司向外国投资者出售油气管道股权，并增加FDI流入量。\n",
      "\n",
      "3. **海外投资多元化**：扩大海外资产配置，将投资范围从欧美市场转向中国等亚太地区。海湾国家的主权投资者开始在医疗、科技、互联网等领域进行投资。\n",
      "\n",
      "4. **经济转型需求**：响应国际形势变化和全球低碳趋势加速推进的需求，海湾六国重视绿色经济发展，为中海经贸合作创造机遇。\n",
      "\n",
      "通过这些措施，海湾六国旨在实现经济结构的优化升级，减少对传统能源的过度依赖，并推动经济向多元化、可持续的方向发展。\n",
      "\n",
      "=== STEP 1: RETRIEVAL (round: 0)===\n",
      "Searching for: 浮动利率房贷在新增房贷中的占比有何变化，为什么会有这种变化？\n",
      "\n",
      "=== STEP 2: VALIDATION (round: 1)===\n",
      "structured response: {'status': 'COMPLETE', 'useful_information': '浮动利率房贷在新增房贷中的占比有所增加，原因包括经济环境改善、政策调整以及市场对利率下降的预期。', 'missing_information': ''}\n",
      "router decision: COMPLETE\n",
      "\n",
      "=== STEP 3: ANSWERING (round: 1)===\n",
      "answer: 根据报告所述，采用浮动利率或最初若干年为浮动利率的贷款类型在新增房贷中占比上升了。这一变化的原因在于，相对于固定利率，浮动利率不仅通常低100个基点以上，在当前高利率环境下，使用浮动利率可以进一步减轻债务人的还款负担。\n"
     ]
    }
   ],
   "source": [
    "for idx, row in tqdm(prediction_df.iterrows(), total=len(prediction_df)):\n",
    "    uuid = row['uuid']\n",
    "    question = row['question']\n",
    "    if question in finished_questions:\n",
    "        continue\n",
    "\n",
    "    fallback = 0\n",
    "    compiled_graph = workflow.compile()\n",
    "    try:\n",
    "        result = compiled_graph.invoke({'question': question})\n",
    "        answer = result['answer_to_question']\n",
    "    except Exception as e:\n",
    "        print(f\"e: {e}, 兜底\")\n",
    "        fallback = 1\n",
    "        answer, _ = rag(llm, question)\n",
    "    \n",
    "    answer_dict[question] = {\n",
    "        'uuid': uuid,\n",
    "        'ref_answer': row['ref_answer'],\n",
    "        'gen_answer': answer,\n",
    "        'fallback': fallback\n",
    "    }\n",
    "    finished_questions.add(question)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "1bd822e7-e3ca-4906-ab7d-6af479502dce",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-07T09:31:32.722595Z",
     "iopub.status.busy": "2025-03-07T09:31:32.722325Z",
     "iopub.status.idle": "2025-03-07T09:31:32.726097Z",
     "shell.execute_reply": "2025-03-07T09:31:32.725749Z",
     "shell.execute_reply.started": "2025-03-07T09:31:32.722581Z"
    }
   },
   "outputs": [],
   "source": [
    "prediction_df.loc[:, 'gen_answer'] = prediction_df['question'].apply(lambda q: answer_dict[q]['gen_answer'])\n",
    "prediction_df.loc[:, 'fallback'] = prediction_df['question'].apply(lambda q: answer_dict[q]['fallback'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "f436e6d9-f4d5-4ba7-821a-4fe80df33f58",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-07T09:31:32.726816Z",
     "iopub.status.busy": "2025-03-07T09:31:32.726542Z",
     "iopub.status.idle": "2025-03-07T09:31:32.739791Z",
     "shell.execute_reply": "2025-03-07T09:31:32.739323Z",
     "shell.execute_reply.started": "2025-03-07T09:31:32.726803Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "prediction_df['fallback'].sum()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cf9cecdc-c5f7-4edb-ab5b-382ca1ff5b75",
   "metadata": {},
   "source": [
    "# 评估"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "bbd39436-ddec-4ea9-b963-5736d61e2186",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-07T09:31:32.740524Z",
     "iopub.status.busy": "2025-03-07T09:31:32.740387Z",
     "iopub.status.idle": "2025-03-07T09:31:33.152397Z",
     "shell.execute_reply": "2025-03-07T09:31:33.151905Z",
     "shell.execute_reply.started": "2025-03-07T09:31:32.740511Z"
    }
   },
   "outputs": [],
   "source": [
    "from langchain_openai import ChatOpenAI\n",
    "import time\n",
    "\n",
    "judge_llm = ChatOpenAI(\n",
    "    api_key=os.environ['LLM_API_KEY'],\n",
    "    base_url=os.environ['LLM_BASE_URL'],\n",
    "    model_name='qwen2-72b-instruct',\n",
    "    temperature=0\n",
    ")\n",
    "\n",
    "def evaluate(prediction_df):\n",
    "    \"\"\"\n",
    "    对预测结果进行打分\n",
    "    :param prediction_df: 预测结果，需要包含问题，参考答案，生成的答案，列名分别为question, ref_answer, gen_answer\n",
    "    :return 打分模型原始返回结果\n",
    "    \"\"\"\n",
    "    prompt_tmpl = \"\"\"\n",
    "你是一个经济学博士，现在我有一系列问题，有一个助手已经对这些问题进行了回答，你需要参照参考答案，评价这个助手的回答是否正确，仅回复“是”或“否”即可，不要带其他描述性内容或无关信息。\n",
    "问题：\n",
    "<question>\n",
    "{{question}}\n",
    "</question>\n",
    "\n",
    "参考答案：\n",
    "<ref_answer>\n",
    "{{ref_answer}}\n",
    "</ref_answer>\n",
    "\n",
    "助手回答：\n",
    "<gen_answer>\n",
    "{{gen_answer}}\n",
    "</gen_answer>\n",
    "请评价：\n",
    "    \"\"\"\n",
    "    results = []\n",
    "\n",
    "    for _, row in prediction_df.iterrows():\n",
    "        question = row['question']\n",
    "        ref_answer = row['ref_answer']\n",
    "        gen_answer = row['gen_answer']\n",
    "\n",
    "        prompt = prompt_tmpl.replace('{{question}}', question).replace('{{ref_answer}}', str(ref_answer)).replace('{{gen_answer}}', gen_answer).strip()\n",
    "        \n",
    "        retry_count = 3\n",
    "        result = ''\n",
    "        \n",
    "        while retry_count > 0:\n",
    "            try:\n",
    "                result = judge_llm.invoke(prompt).content\n",
    "                break\n",
    "            except Exception as e:\n",
    "                retry_count -= 1\n",
    "                sleeping_seconds = 2 ** (4 - retry_count)\n",
    "                print(f\"query={query}, error={e}, sleeping={sleeping_seconds}, remaining retry count={retry_count}\")\n",
    "                \n",
    "                time.sleep(sleeping_seconds)\n",
    "        \n",
    "        results.append(result)\n",
    "\n",
    "        time.sleep(1)\n",
    "    return results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "id": "da5034d6-0e05-4dca-a032-0ce0d0e0ede4",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-07T09:31:33.152910Z",
     "iopub.status.busy": "2025-03-07T09:31:33.152781Z",
     "iopub.status.idle": "2025-03-07T09:34:09.315540Z",
     "shell.execute_reply": "2025-03-07T09:34:09.313789Z",
     "shell.execute_reply.started": "2025-03-07T09:31:33.152898Z"
    }
   },
   "outputs": [],
   "source": [
    "prediction_df['raw_score'] = evaluate(prediction_df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "faaabdb2-e223-4641-8646-377709eafc65",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-07T09:34:09.317999Z",
     "iopub.status.busy": "2025-03-07T09:34:09.317440Z",
     "iopub.status.idle": "2025-03-07T09:34:09.328378Z",
     "shell.execute_reply": "2025-03-07T09:34:09.327292Z",
     "shell.execute_reply.started": "2025-03-07T09:34:09.317914Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['是', '否'], dtype=object)"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "prediction_df['raw_score'].unique()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "id": "1b9e7b50-fcd7-49e3-82a8-b0d4ce79cf83",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-07T09:34:09.329719Z",
     "iopub.status.busy": "2025-03-07T09:34:09.329351Z",
     "iopub.status.idle": "2025-03-07T09:34:09.340777Z",
     "shell.execute_reply": "2025-03-07T09:34:09.339607Z",
     "shell.execute_reply.started": "2025-03-07T09:34:09.329683Z"
    }
   },
   "outputs": [],
   "source": [
    "prediction_df['score'] = (prediction_df['raw_score'] == '是').astype(int)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "id": "dfe16d77-ecb5-40b5-8955-41cbe1397574",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-07T09:34:09.342363Z",
     "iopub.status.busy": "2025-03-07T09:34:09.341995Z",
     "iopub.status.idle": "2025-03-07T09:34:09.350028Z",
     "shell.execute_reply": "2025-03-07T09:34:09.348973Z",
     "shell.execute_reply.started": "2025-03-07T09:34:09.342328Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.67"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "prediction_df['score'].mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "id": "6cb0d9f8-1ecf-4541-987b-96e32b34cefe",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-07T09:34:09.351872Z",
     "iopub.status.busy": "2025-03-07T09:34:09.351270Z",
     "iopub.status.idle": "2025-03-07T09:34:09.359201Z",
     "shell.execute_reply": "2025-03-07T09:34:09.357981Z",
     "shell.execute_reply.started": "2025-03-07T09:34:09.351836Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "67"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "prediction_df['score'].sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "aaba866e-3824-4103-9426-23a4777bc23b",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-07T09:34:09.371279Z",
     "iopub.status.busy": "2025-03-07T09:34:09.370912Z",
     "iopub.status.idle": "2025-03-07T09:34:09.476922Z",
     "shell.execute_reply": "2025-03-07T09:34:09.476427Z",
     "shell.execute_reply.started": "2025-03-07T09:34:09.371243Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "prediction_df['fallback'].sum()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "92610680-ad56-4d82-b289-0b984e202239",
   "metadata": {},
   "source": [
    "有4条发生兜底"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "id": "96ce13dd-fd6c-46b6-ba96-35dc3c8a8bd9",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-07T09:34:09.477756Z",
     "iopub.status.busy": "2025-03-07T09:34:09.477464Z",
     "iopub.status.idle": "2025-03-07T09:34:09.827154Z",
     "shell.execute_reply": "2025-03-07T09:34:09.826787Z",
     "shell.execute_reply.started": "2025-03-07T09:34:09.477742Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: xlabel='fallback', ylabel='score'>"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import seaborn as sns\n",
    "\n",
    "sns.boxplot(x='fallback', y='score', data=prediction_df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4afd6be2-1e82-4a33-b3f5-aad93976f8cf",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
